[英]Basic paintComponent not being called by repaint()?
我正在使用《 Headfirst 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");
}
}
请参阅我对这个问题的回答 。 它提供了设置JPanel的正确方法的示例。
就像其他评论者/答者说的那样, paintComponent
属于JPanel
类。 这对您意味着什么,您需要创建一个扩展 JPanel的类(我们称其为MyPanel
)。 (注意:如果您在eclipse中,则可以为此类创建一个新的.java文件,或者将其设置为内部类,无论哪种方式都可以工作)。
完成此操作后,只需从setup
类中剪切paintCOmponent方法并将其粘贴到新的MyPanel
类中即可。
最后,在您的安装程序类中,而不是创建JPanel
对象,而是创建MyPanel
。
基本上,这个MyPanel
对象是您自己的自定义JPanel
对象,它可以执行您想要的任何操作! 几乎就像魔术!
附带说明(这希望将来可以帮助您更好地格式化代码),并希望有更多Java程序员的经验,对此我也表示同意,我也建议您也创建自己的自定义JFrame
对象。 仅此一项,您将不会覆盖constructor
方法以外的任何方法。 相反,在此自定义JFrame
constructor
中,您将创建窗口的所有规范(例如setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
和setSize(300,300)
调用)。在此constructor
中,还将实例化MyPanel
对象(如以及窗口中的任何其他组件对象),并可能给它一些ActionListener
。
然后,在另一个类(例如您的setup
类)中,有一个main
方法,其中有1行:实例化“ JFrame”对象的行。 这将自动创建窗口。
哦,还有一件至关重要的事情:如果要显示它,必须在JFrame
上调用setVisible(true)
。 我不确定为什么要这样设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.