1

我无法完成一项相当简单的任务,即获取圆的直径然后绘制它。到目前为止,这是我的代码。

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 方法。有人可以帮我解决这个问题吗?谢谢。

4

1 回答 1

5

您的程序实际上正在创建两个 Shapes 对象,其中一个具有正确设置的直径字段但未显示,另一个保持直径的默认值 0 并显示。

建议:

  1. 不要直接在 JFrame 中绘制,而是在 JFramepaintComponent(Graphics g)持有并显示在 JFrame 中的 JPanel 的方法覆盖中绘制。这有很多原因,但其中一个原因是,该paint(...)方法不仅负责绘制组件,还负责绘制组件的边框和子项,这将防止您在paint(...)尝试绘制 GUI 的子项和边框时出现问题。考虑到 Swing 组件默认使用双缓冲,它还将帮助您的动画(您肯定很快就会这样做)变得流畅。
  2. 始终super.paintComponent(g)在 JPanel 的paintComponent覆盖中调用该方法。这将允许 Swing 擦除需要擦除的图像。
  3. 不要创建两个 Shapes 对象,而是只创建一个. 这将大大简化事情,并允许您设置唯一重要对象的直径值。
  4. 更改直径字段的值后,在您的 GUI 上调用 repaint,以便调用显示的 JPanel 的paintComponent。
于 2013-09-10T14:29:39.770 回答