2010-01-27 15 views
1

我想創建一個「通用」 JPanel它可以在任何上級Window類的呈現(JFrameJDialog,或JInternalFrame是有些精確。)如何將一個JPanel鉤入父代/祖先容器的windowClosing/Closed監聽器?

我希望能夠「清理」該窗口不再在屏幕上呈現時的一些靜態值。通常,我會在創建JFrame期間用Window類(如JFrame)和addWindowListener以及正確的windowClosingwindowClosed方法完成此操作。

由於我希望Window類中的任何一個能夠呈現此類,我甚至不知道要添加哪種類型的偵聽器,也不知道要將其添加到哪個窗口。

有沒有辦法'掛鉤'的JPanel的實現和渲染,以便我可以添加我的關閉掛鉤無論Window類呈現它?

(我看着PropertyChangeListener,但componentShown不會對JPanel渲染觸發。)

任何幫助,將不勝感激。

回答

0

根據所需的確切語義,有幾個不同的選項。您可以註冊ComponentListener並處理componentHidden方法。另一種可能性是註冊HierarchyListener並檢查DISPLAYABILITY_CHANGED事件。您還可以使用HierarchyListener來查找面板何時添加或從容器中移除,以及添加/刪除舊窗口和新窗口中的窗口偵聽器。 ComponentListenerHierarchyListener之間的區別在於ComponentListener是由任何可見性更改觸發的,而當面板的窗口被丟棄時觸發事件。 ComponentListener可能是您最好的選擇,但請注意,面板可能會在未來再次設置爲可見。

您還可以嘗試AncestorListenerancestorRemoved事件。如果組件本身或它的任何一個祖先都被視爲無效的,就會被調用。

+1

當封閉窗口關閉時,componentHidden不會被「拋出」,我猜是因爲組件/ JPanel本身沒有更改其可見性屬性。它不再呈現。不過,我會研究HierarchyListener。 –

+0

我相信HierarchyListener是比AncestorListener更好的解決方案。效果很好。謝謝,傑夫。 –

2

嗯,我終於有了一些工作,但我不確定我真的很喜歡答案。

我在創建時將AncestorListener添加到了JPanel。這位聽衆剔除了ancestorRemovedancestorMoved事件,並在ancestorAdded事件中將掛鉤getTopLevelAncestor()與適當的WindowListener/InternalFrameListener,以便我可以在窗口關閉時運行我的關機代碼。

如果有更好的方法,我願意接受。 (我將要審查來自Geoff的HierarchyListener。)