2013-07-22 105 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

相關問題