我想创建一个'通用'JPanel
,可以在任何更高级Window
类(JFrame
,JDialog
或{{1}中呈现有点精确。)
我希望能够在屏幕上不再呈现该窗口时“清理”一些静态值。通常情况下,我会使用JInternalFrame
类(例如Window
)和JFrame
使用正确的addWindowListener
或windowClosing
方法执行此操作1}}。
由于我希望任何windowClosed
类能够呈现这个,我甚至不知道要添加哪种类型的监听器,也不知道要将哪个窗口添加到其中。
有没有办法'挂钩'JFrame
的实现和呈现,以便我可以添加我的关闭钩子,无论Window
类呈现它?
(我查看了JPanel
,但在Window
渲染时PropertyChangeListener
没有触发。)
任何帮助都将不胜感激。
答案 0 :(得分:2)
好吧,我终于有了一些工作,但我不确定我是否真的喜欢这个答案。
我在创建时向AncestorListener
添加了JPanel
。此侦听器删除了ancestorRemoved
和ancestorMoved
事件,并在ancestorAdded
事件中将getTopLevelAncestor()
与相应的WindowListener
/ InternalFrameListener
挂钩,以便我可以在窗口关闭时运行我的关机代码。
如果有更好的方法,我会对它持开放态度。 (我将从Geoff审查HierarchyListener
。)
答案 1 :(得分:0)
根据您想要的确切语义,有几个不同的选项。您可以注册ComponentListener
并处理componentHidden
方法。另一种可能性是注册HierarchyListener
并检查DISPLAYABILITY_CHANGED
事件。您还可以使用HierarchyListener
查找从容器添加或删除面板的时间,并从旧窗口和新窗口添加/删除窗口侦听器。 ComponentListener
和HierarchyListener
之间的区别在于ComponentListener
由任何可见性更改触发,而HierarchyListener
/ DISPLAYABILITY_CHANGED
事件在面板的窗口为处置。 ComponentListener
可能是您最好的选择,但请注意,该面板可能会在将来再次显示为可见。
您还可以尝试AncestorListener
ancestorRemoved
事件。如果组件本身或其任何祖先是无形的,则调用它。