2013-07-02 51 views
1

我有以下代碼:爲什麼setBackground會覆蓋其他繪圖?

private void ConvertButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    getContentPane().setBackground(new Color(50, 100, 200)); 
    Graphics g = getGraphics(); 
    g.drawString("tekst", 120, 120); 
    g.drawLine(175, 175, 140, 140); 
    g.setColor(Color.yellow); 
    g.fillOval(190, 120, 160, 160); 
    g.setColor(Color.red); 
    g.drawRoundRect(190, 110, 150, 120, 115, 115); 
}  

我想它畫的形式,在適當的方式(按下按鈕後),但會發生什麼,而不是被它描繪只有第一次點擊後和後背景第二次點擊它繪製其餘的對象。 當我嘗試這一方法代替,具有壓倒一切的塗料方法:

public void paint(Graphics g){ 
    setBackground(new Color(50, 100, 200));  
    g.drawString("tekst", 120, 120); 
    g.drawLine(175, 175, 140, 140); 
    g.setColor(Color.yellow); 
    g.fillOval(190, 120, 160, 160); 
    g.setColor(Color.red); 
    g.drawRoundRect(190, 110, 150, 120, 115, 115); 
} 

和具有

private void ConvertButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    repaint(); 
} 

則背景爲灰色的顏色,而不是藍色和按鈕消失(的僅出現後我有鼠標右鍵)。

所以,最後我的問題是:這兩個例子究竟有什麼問題(我想同時理解,因爲這只是一個學習練習,我想知道發生了什麼,而不是簡單地找到解決方案) ,哪種方法更好?在此先感謝,我希望我不會錯過本網站上的類似問題,如果我確實對不起!

+1

其實,你永遠不應該調用'setBackground ()'或在'paint()'或'paintComponent()'中設置其他屬性,因爲這將觸發一個'PropertyChange'事件,這將導致組件的repaint()。 – haraldK

回答

2
Graphics g = getGraphics(); 

請勿使用getGraphics()進行自定義繪畫。這種類型的繪畫只是暫時的,下一次Swing會重新繪製組件。另外,請勿覆蓋paint()方法。設置您剛剛執行的組件的背景顏色:

component.setBackground(...); 

自定義繪畫是通過覆蓋自定義組件的paintComponent()方法來完成的。不要忘記在開始時調用super.paintComponent()。有關更多信息,請參閱Custom Painting上的Swing教程。

+0

好的thx評論這兩個代碼段。一個問題,但我覆蓋了paint方法而不是paintComponent,因爲我的組件(它擴展了JFrame fyi)似乎並沒有繼承paintComponent。我在API中查找JFrame,如果我沒有弄錯,它不會繼承它。那麼我錯過了什麼,我應該如何重寫paintComponent方法? Thx提前! – MountainThatCodes

+0

你不應該擴展JFrame。在Swing中構建GUI的正確方法是將組件添加到框架。您可以擴展添加到框架的任何組件,但不需要擴展JFrame。閱讀Swing教程,並查看教程中的任何示例。沒有任何例子擴展JFrame。 – camickr

+0

但是他們確實在教程中擴展了JFrame,例如在攝氏轉換器程序中,所有的代碼都在類「CelsiusConverterGUI extends javax.swing.JFrame」中。這不好,爲什麼?另外,如果JFrame沒有paintComponent,那麼我應該在哪裏重寫paintComponent方法? Thx再次提前,我感謝你的幫助。 – MountainThatCodes

2

,你重寫paint是正確的方法,你應該使用:的

g.setColor(new Color(50, 100, 200)); 
g.fillRect(0, 0, c.getWidth(),c.getHeight()); 

代替:

setBackground(new Color(50, 100, 200)); 

或替代地設置背景顏色和你的paint()方法中,調用在繪畫之前超級實現:

super.paint(g); 
相關問題