2010-01-27 19 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。)