2011-01-26 127 views
1

我正在構建一個自定義的swing組件(更像是一個實際的思想實驗)。自定義swing組件:重繪問題()

我遇到了重新繪製的問題。我的組件具有jtree,一個jtable,然後就是完全自定義的畫的一部分(希望結束了相當MS項目式的ganttview)

的具體問題是,當JTree的擴大,表和甘特視圖應更新以反映新擴展的treenode下的新子項目。他們這樣做,但尺寸不更新,所以表格不顯示額外的行,而且我的gannt顯示也沒有使用完整的高度。

奇怪的是,如果我觸摸jframe上的窗口句柄(所以即使是1px調整大小) - 這似乎強制完全刷新,然後組件顯示正常,中間的表格和gannt正確填滿顯示屏。

如果我不做調整大小,那麼當樹中的節點展開/摺疊時調用repaint,因爲我看到ganttview更新,但它看起來並沒有展開佔據整個高度屏幕。

我已經在下面的屏幕截圖中顯示了resize()後的正確顯示,下半部分是我看到如果我不擴大節點而不進行調整大小。

我的斷言是,組件知道如何正確重繪()它本身,因爲它在調整大小上做了正確的事情,但是這必須觸發一個特殊事件來強制更新。我嘗試過各種組合update(),invalidate(),repaint(),但似乎無法模擬父窗體調整大小時發生的完整repaint()。

Screenshot

感謝,王牌

回答

1

奇怪的是,如果我碰的窗口句柄上的JFrame(因此,即使1px的調整大小) - 這似乎強制完全刷新和組件然後正確顯示,

當一個框架被調整大小時,組件被重新驗證和重新繪製。因此,在你的代碼中的某個地方(表格和gannt視圖更新的地方),你需要添加:

customComponent.revalidate(); 
customComponent.repaint(); 
+0

很多謝謝,這樣做的伎倆 – phatmanace 2011-01-27 22:56:02