我正在使用 Head First java 这本书,我已经整理了一个我认为编译得很好的程序。但是当创建窗口时,背景或椭圆形没有显示出来。
import javax.swing.*;
import java.awt.*;
public class setup {
public static void main(String[] args) {
JFrame f = new JFrame();
System.out.println("Created Frame");
JPanel myJPan = new JPanel();
System.out.println("Created Panel");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300,300);
System.out.println("Set Size");
f.setLocationRelativeTo(null);
f.setContentPane(myJPan);
f.setVisible(true);
System.out.println("Made Visible");
myJPan.repaint();
}
// @Override ???
// "protected void" ??
public void paintComponent(Graphics g) {
// super.paintComponent(); ???
g.fillRect(0,0,300,300);
System.out.println("painted");
int red = (int) (Math.random()*255);
int green = (int) (Math.random()*255);
int blue = (int)(Math.random()*255);
System.out.println("Got Random Colors");
Color randomColor = new Color(red, green, blue);
g.setColor(randomColor);
System.out.println("Set Random Colors");
g.fillOval(70,70,100,100);
System.out.println("Filled Oval");
}
}
答案 0 :(得分:0)
请参阅我对this question的回答。它提供了设置JPanel的正确方法的示例。
与其他评论者/回答者一样,paintComponent
属于JPanel
类。这对您来说意味着您需要创建一个扩展 JPanel的类(我们称之为MyPanel
)。 (注意:如果您在eclipse中或者使其成为内部类,您可以为此类创建一个新的.java文件,它应该以任何方式工作。)
完成后,只需从setup
类中剪切paintCOmponent方法并将其粘贴到新的MyPanel
类中。
最后,在您的设置类中,创建JPanel
,而不是创建MyPanel
对象。
基本上,这个MyPanel
对象是您自己的自定义JPanel
对象,可以执行您想要的任何操作!这几乎就像魔术一样!
在旁注(这有望帮助您在将来更好地格式化代码),并希望更多经验Java程序员会同意我这一点,我还建议您创建自己的自定义JFrame
对象也是。只有这一个,你不会覆盖constructor
以外的任何方法。相反,在constructor
这个自定义JFrame
的{{1}}中,您将制定该窗口的所有规范(例如setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
和setSize(300,300)
来电。这个constructor
也是您实例化MyPanel
对象(以及窗口中的任何其他组件对象)的地方,也许会给它一些ActionListener
。
然后,在另一个类(例如您的setup
类)中,使用一个main
方法,该方法有一行:一个实例化一个'JFrame`对象。这将自动创建窗口。
哦,还有一个非常重要的事情:如果你想要显示,你必须在你的setVisible(true)
上拨打JFrame
。我不确定为什么这样设置。