尝试在 Java 中使用参数中的变量绘制一个圆



我在做一个相当简单的任务时遇到了麻烦,即获取圆的直径然后绘制它。这是我到目前为止的代码。

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 并显示。

建议:

  1. 不要直接在 JFrame 中绘制,而是在 JFrame 中保存并显示在 JPanel 的paintComponent(Graphics g)方法重写中绘制。造成这种情况的原因有很多,但首先,由于paint(...)方法不仅负责绘制组件,还负责绘制其边框和子项,这将防止您在尝试绘制 GUI 的子项和边框时paint(...)引起问题。它还将帮助您的动画(您肯定会很快这样做)平滑,因为 Swing 组件默认使用双缓冲。
  2. 始终在 JPanel 的paintComponent重写中调用 super.paintComponent(g) 方法。这将允许 Swing 擦除需要擦除的图像。
  3. 不要创建两个 Shapes 对象,而只创建一个。这将大大简化事情,并允许您设置唯一重要对象的直径值。
  4. 更改直径字段的值后,在 GUI 上调用重绘,以便调用显示的 JPanel 的 paintComponent。

相关内容

  • 没有找到相关文章

最新更新