使用drawOval()方法绘制椭圆

时间:2014-01-18 18:37:41

标签: java swing graphics

起初我按如下方式编写了这个类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);
    }
}

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

2 个答案:

答案 0 :(得分:1)

您永远不会调用setDiameter(...),因此该字段包含0值,不会绘制任何椭圆。

一种解决方案是尝试记住每次创建DrawOval对象时调用此方法,但为什么要强迫自己记住这个?而是将直径作为构造函数的参数,并确保该类没有默认构造函数,以便在创建对象时将直径字段必须设置为某个值。另一个选项是给直径字段一个默认值,这样即使它从未明确设置,它也总是隐式设置。

答案 1 :(得分: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);

}