有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    这并不是我见过的最丑陋的事情(我甚至不会说它有那么糟糕),但你必须问问自己:为什么你的面板真的需要知道窗户何时关闭?这似乎是一个奇怪的耦合,最好是删除

    我不太了解你的背景,也不知道你现在真正想做什么来提出一个替代方案。但是,如果面板需要了解其所在的容器,则可能存在一些不良设计和有害耦合