2012-02-22 66 views

回答

33
  • AWT,覆蓋paint()
  • 搖擺頂層容器(例如:JApplet,JFrame,JWindow,JDialog ..),覆蓋paint()。但是有一些很好的理由而不是塗在TLC。也許是一個單獨問題的主題。
  • Swing的其餘部分覆蓋paintComponent()
  • 既不重寫也不明確呼叫paintComponents(),將其留給API以在需要時調用它。

一定要在覆蓋某個方法時使用@Override表示法。

這樣做會暗示試圖在JFrame(它沒有這種方法)中覆蓋paintComponent(..)的問題,這很常見。

+0

嗨,是構造函數完成執行後立即調用paint()函數嗎? – GMsoF 2012-11-27 02:17:42

+0

或者我們必須手動調用repaint()? – GMsoF 2012-11-27 02:18:03

+1

@GMsoF'repaint()'將在需要時自動調用。如果動畫,它可能也被明確地調用。儘管調用次數太多,但速度太快,並且一些調用會被合併(忽略)。 – 2012-11-27 03:29:02

15

你可能有興趣在閱讀Painting in AWT and Swing

引述:

適用於AWT的輕量級組件規則也適用於Swing組件 - 例如,paint()方法時,它的時候被調用呈現 - 除了搖擺進一步因素塗料()調用成三個獨立的方法,它們在下面的順序調用:

protected void paintComponent(Graphics g) 
protected void paintBorder(Graphics g) 
protected void paintChildren(Graphics g) 

Swing程序應該覆蓋paintComponent()而不是覆蓋paint()。雖然API允許,但通常沒有理由重寫paintBorder()或paintComponents()(如果你這樣做,確保你知道你在做什麼!)。這種保理使程序更容易覆蓋他們需要擴展的繪畫部分。例如,這解決了前面提到的AWT問題,即無法調用super.paint()會阻止任何輕量級子項出現。

相關問題