1

我想创建一个JPanel可以在任何更高级别的Window类中呈现的“通用”(JFrame, JDialog,或者JInternalFrame更准确地说。)

当该窗口不再在屏幕上呈现时,我希望能够“清理”一些静态值。通常Window,我JFrameaddWindowListenerwindowClosing创建windowClosed.JFrame

因为我希望任何Window类都能够呈现它,所以我什至不知道要添加哪种侦听器,也不知道要将它添加到哪个窗口。

有没有办法“挂钩” to 的实现和渲染,JPanel以便无论什么Window类渲染它,我都可以添加关闭挂钩?

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

任何帮助,将不胜感激。

4

2 回答 2

2

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

我在创建时添加AncestorListener了一个。JPanel该侦听器将ancestorRemovedandancestorMoved事件排除在外,并且在ancestorAdded事件中,将getTopLevelAncestor()与适当的WindowListener/挂钩,InternalFrameListener以便我可以在窗口关闭时运行我的关闭代码。

如果有更好的方法,我愿意接受。(我将回顾HierarchyListenerGeoff 的文章。)

于 2010-01-27T16:05:00.397 回答
0

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

你也可以试试这个AncestorListener ancestorRemoved活动。如果组件本身或其任何祖先被设为不可见,则调用它。

于 2010-01-27T15:56:11.167 回答