4
我正在尝试监听JPanel的父JFrame上的窗口关闭事件。在WindowClosing事件中,我想将一个监听器注册到一个不同的组件。
不幸的是我唯一可以运行的代码是面板的构造函数。这意味着面板本身没有祖先窗口,所以简单地调用SwingUtilities.getWindowAncestor不起作用。因此,我所做的是注册一个层次结构侦听器,并在hierarchyChanged事件中查找SHOWING_CHANGED事件。甚至在发生火灾时,现在我可以寻找面板的窗口祖先。从JPanel附加到窗口事件
所以基本上我有以下几点:
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);
}
});
}
}
});
}
}
这是理智?是否有更合理的方法来处理关门事件?