基本的paintComponent没有被repaint()调用?

时间:2013-07-22 17:37:06

标签: java swing graphics paint

我正在使用 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");
  }
}

1 个答案:

答案 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_CLOSEsetSize(300,300)来电。这个constructor也是您实例化MyPanel对象(以及窗口中的任何其他组件对象)的地方,也许会给它一些ActionListener

然后,在另一个类(例如您的setup类)中,使用一个main方法,该方法有一行:一个实例化一个'JFrame`对象。这将自动创建窗口。

哦,还有一个非常重要的事情:如果你想要显示,你必须在你的setVisible(true)上拨打JFrame。我不确定为什么这样设置。