【问题标题】:Attach to Window events from JPanel从 JPanel 附加到 Window 事件
【发布时间】: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


    【解决方案1】:

    这不是我见过的最丑陋的东西(我什至不会说它有那么糟糕),但你必须问自己:为什么你的面板真的需要知道什么时候窗口已经关闭?这似乎是一个最好移除的奇怪耦合。

    我对您的背景以及您现在真正想要完成的工作的了解不够,无法提出替代方案。但是,如果面板需要了解它所在的容器,则可能存在一些带有有害耦合的不良设计。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2016-05-24
      相关资源
      最近更新 更多