使用drawoal()方法绘制椭圆形



首先,我写了此类drawoval.java,如下: -

public class DrawOval extends JPanel{
    private int diameter = 10;
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.fillOval(10,10,diameter,diameter);
    }
    public void setDiameter(int newD){
        diameter = (newD>=0 ? newD : 10);
        repaint();
    }
    public Dimension getPreferredSize(){
        return new Dimension(200,200);
    }
    public Dimension getMinimumSize(){
        return getPreferredSize();
    }
}

然后我写了此类thewindow.java,如下: -

public class TheWindow extends JFrame{
    private DrawOval myPanel;
    public TheWindow(){
        super("The title");
        myPanel = new DrawOval();
        myPanel.setBackground(Color.GREEN);
        add(myPanel,BorderLayout.CENTER);
    }
}

终于我写了主班,如下所示: -

public class Test{
    public static void main(String[] args){
        TheWindow w = new TheWindow();
        w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        w.setSize(300,300);
        w.setVisible(true);
    }
}

,输出只是一个没有任何椭圆形的绿色背景的框架?

您永远不会调用setDiameter(...),因此该字段保持0值,并且不会绘制椭圆形。

一个解决方案是尝试记住每次创建一个绘制对象时都调用此方法,但是为什么要迫使自己记住这一点呢?取而代之的是使直径成为构造函数的参数,并确保类没有默认的构造函数,以便将直径字段必须设置为对象创建的某些值。另一个选项是使直径字段一个默认值,因此即使从未明确设置它,它也将始终被隐式设置。

您应该调用setDiameter方法,以便绘制要绘制的椭圆形形状。但是我认为您应该将此方法与PaintComponent合并。通过这种方式,您不应该关心调用该方法。

我的意思是:

public void paintComponent(Graphics g, int newD){
    super.paintComponent(g);
    diameter = (newD>=0 ? newD : 10);
    repaint();          
    g.fillOval(10,10,diameter,diameter);
}

最新更新