如何将JPanel挂钩到父/祖先容器的windowClosing / Closed监听器?

时间:2010-01-27 15:35:28

标签: jframe jpanel listener jdialog jinternalframe

我想创建一个'通用'JPanel,可以在任何更高级Window类(JFrameJDialog或{{1}中呈现有点精确。)

我希望能够在屏幕上不再呈现该窗口时“清理”一些静态值。通常情况下,我会使用JInternalFrame类(例如Window)和JFrame使用正确的addWindowListenerwindowClosing方法执行此操作1}}。

由于我希望任何windowClosed类能够呈现这个,我甚至不知道要添加哪种类型的监听器,也不知道要将哪个窗口添加到其中。

有没有办法'挂钩'JFrame的实现和呈现,以便我可以添加我的关闭钩子,无论Window类呈现它?

(我查看了JPanel,但在Window渲染时PropertyChangeListener没有触发。)

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

好吧,我终于有了一些工作,但我不确定我是否真的喜欢这个答案。

我在创建时向AncestorListener添加了JPanel。此侦听器删除了ancestorRemovedancestorMoved事件,并在ancestorAdded事件中将getTopLevelAncestor()与相应的WindowListener / InternalFrameListener挂钩,以便我可以在窗口关闭时运行我的关机代码。

如果有更好的方法,我会对它持开放态度。 (我将从Geoff审查HierarchyListener。)

答案 1 :(得分:0)

根据您想要的确切语义,有几个不同的选项。您可以注册ComponentListener并处理componentHidden方法。另一种可能性是注册HierarchyListener并检查DISPLAYABILITY_CHANGED事件。您还可以使用HierarchyListener查找从容器添加或删除面板的时间,并从旧窗口和新窗口添加/删除窗口侦听器。 ComponentListenerHierarchyListener之间的区别在于ComponentListener由任何可见性更改触发,而HierarchyListener / DISPLAYABILITY_CHANGED事件在面板的窗口为处置。 ComponentListener可能是您最好的选择,但请注意,该面板可能会在将来再次显示为可见。

您还可以尝试AncestorListener ancestorRemoved事件。如果组件本身或其任何祖先是无形的,则调用它。