起初我按如下方式编写了这个类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);
}
}
并且输出只是一个绿色背景的框架,没有任何椭圆形?
答案 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);
}