2011-02-11 86 views
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); 
         } 
        }); 
       } 
      } 
     }); 
    } 
} 

这是理智?是否有更合理的方法来处理关门事件?

回答

3

这不是我见过的最丑恶的事情(我什至说这些都不好),但是你必须问自己:为什么你的窗户关闭时真的需要知道?这似乎是一个奇怪的耦合,最好将其删除。

我对您的上下文以及您真正想要完成的建议现在可以选择的其他方面知之甚少。但是,如果面板需要知道它所在的容器,那么可能会有一些坏的设计与有害的耦合。