2013-07-22 56 views
0

我正在使用这本书Headfirst java,我已经整理了一个我认为能编译好的程序。但是,当窗口创建时,背景或椭圆形不显示。基本paintComponent不被repaint()调用?

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

'paintComponent'属于'JPanel'' myJPan'类而不是'setup'类 – Reimeus

+0

你实际上并没有重写'myJPan'的'paintComponent'方法。你只需在你的'setup'类中定义一个'paintComponent'方法。 – DannyMo

+0

如果您添加了@ @ Override注解,编译器会告诉您实际上并没有覆盖任何东西。 – DannyMo

回答

0

看到我的回答this question。它提供了设置JPanel的正确方法的示例。

像其他评论者/回答者所说,paintComponent属于JPanel类。这对你来说意味着你需要创建一个类(我们称之为MyPanel扩展 JPanel。 (注意:你可以为这个类创建一个新的.java文件,如果你在eclipse中,或者使它成为内部类,它应该以任何方式工作)。

完成之后,只需从setup类中剪切paintCOmponent方法,然后将其粘贴到新的MyPanel类中。

最后,在您的设置类中,而不是创建JPanel对象,请创建一个MyPanel

基本上,这个MyPanel对象是你自己定制的JPanel对象,它可以做你想做的任何事情!这几乎像魔术一样!

在附注(这将有助于您更好地在未来更好地设计代码格式),并希望有更多的经验Java程序员会同意我这一点,我还建议您创建自己的定制JFrame对象。只有这个,你不会覆盖constructor以外的任何方法。相反,在您的constructor对于此自定义JFrame,您将制定窗口的所有规格(例如您的setDefaultCloseOperation(JFrame.EXIT_ON_CLOSEsetSize(300,300)调用)。这个constructor也是你实例化你的MyPanel对象(以及窗口中的任何其他组件对象)的地方,也可以给它一些ActionListener

然后,在另一个类(例如setup类)中,有一个main方法,它有1行:一个实例化'JFrame`对象。这将自动创建窗口。哦,还有一件更重要的东西:如果你想显示JFrame,你必须拨打setVisible(true)。我不知道它为什么这样设置。

+0

我不能要求更好的答案,非常感谢 – Tussler

+0

随时。我也在几个月前就与这个概念斗争过了。 – scottyseus

+0

另外,如果它真的回答您的问题,您应该将其标记为答案 – scottyseus

相关问题