首先,我写了此类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);
}