java从JPanel附加到窗口事件
我正在尝试侦听JPanel的父JFrame上的窗口关闭事件。在WindowClosing事件中,我想将侦听器注销到其他组件
不幸的是,我只能运行面板的构造函数。这意味着面板本身还没有祖先窗口,所以只需调用SwingUtilities。GetWindowSenator不工作。所以我要做的是注册一个层次侦听器,并在hierarchyChanged事件中查找显示\u 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);
}
});
}
}
});
}
}
这是理智的吗?是否有更合理的方法来获取帧关闭事件的句柄
# 1 楼答案
这并不是我见过的最丑陋的事情(我甚至不会说它有那么糟糕),但你必须问问自己:为什么你的面板真的需要知道窗户何时关闭?这似乎是一个奇怪的耦合,最好是删除
我不太了解你的背景,也不知道你现在真正想做什么来提出一个替代方案。但是,如果面板需要了解其所在的容器,则可能存在一些不良设计和有害耦合