我在做一个相当简单的任务时遇到了麻烦,即获取圆的直径然后绘制它。这是我到目前为止的代码。
import javax.swing.*;
import java.awt.Graphics;
public class Shapes extends JFrame
{
double diameter;
public Shapes()
{
setSize(600,600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void getDiameter()
{
String input = JOptionPane.showInputDialog("What is the diameter of the circle?");
diameter = Double.parseDouble(input);
Shapes gui = new Shapes();
gui.setVisible(true);
}
public static void main(String[] args)
{
Shapes app = new Shapes();
app.getDiameter();
}
public void paint(Graphics canvas)
{
canvas.drawOval(50, 50, (int)diameter, (int)diameter);
}
}
当我运行它时,它会打开 Jframe 窗口,但没有绘制任何内容,所以我猜测直径的值永远不会传递给 paint 方法。有人可以帮助我解决这个问题吗?谢谢。
您的程序实际上正在创建两个 Shapes 对象,其中一个对象正确设置了直径字段但未显示,另一个保留直径的默认值 0 并显示。
建议:
- 不要直接在 JFrame 中绘制,而是在 JFrame 中保存并显示在 JPanel 的
paintComponent(Graphics g)
方法重写中绘制。造成这种情况的原因有很多,但首先,由于paint(...)
方法不仅负责绘制组件,还负责绘制其边框和子项,这将防止您在尝试绘制 GUI 的子项和边框时paint(...)
引起问题。它还将帮助您的动画(您肯定会很快这样做)平滑,因为 Swing 组件默认使用双缓冲。 - 始终在 JPanel 的
paintComponent
重写中调用super.paintComponent(g)
方法。这将允许 Swing 擦除需要擦除的图像。 - 不要创建两个 Shapes 对象,而只创建一个。这将大大简化事情,并允许您设置唯一重要对象的直径值。
- 更改直径字段的值后,在 GUI 上调用重绘,以便调用显示的 JPanel 的 paintComponent。