【发布时间】:2011-06-25 20:25:01
【问题描述】:
我正在尝试侦听 JPanel 的父 JFrame 上的窗口关闭事件。在 WindowClosing 事件中,我想将侦听器注销到不同的组件。
不幸的是,我可以保证运行的唯一代码是面板的构造函数。这意味着面板本身还没有祖先窗口,所以简单地调用 SwingUtilities.getWindowAncestor 是行不通的。所以我要做的是注册一个层次监听器,并在 hierarchyChanged 事件中查找 SHOWING_CHANGED 事件。当它触发时,现在我可以查找面板的窗口祖先。
所以基本上我有以下几点:
class ShapeControlPanel extends JPanel{
public ShapeControlPanel(){
final ShapeControlPanel me = this;
me.addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
if((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) == HierarchyEvent.SHOWING_CHANGED){
SwingUtilities.getWindowAncestor(me).addWindowListener(new WindowListener() {
/* Snipped some empty handlers */
@Override
public void windowClosing(WindowEvent e) {
/* Finally get to remove the handler. */
me.getApparent().removeLocationSelectionListener(me.GUID(), me);
}
});
}
}
});
}
}
这是理智的吗?有没有更合理的方法来处理框架关闭事件?
【问题讨论】:
标签: java swing event-handling