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

nwr*_*bel 1 java swing drawrectangle

我很难做一个相当简单的任务,即获取圆的直径然后绘制它.到目前为止,这是我的代码.

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它会调出Jframe窗口,但没有绘制任何东西,所以我猜测直径的值永远不会传递给paint方法.有人可以帮助我让这个工作吗?谢谢.

Hov*_*els 5

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

建议:

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