2011-02-11 45 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

這不是我見過的最醜惡的事情(我什至說這些都不好),但是你必須問自己:爲什麼你的窗戶關閉時真的需要知道?這似乎是一個奇怪的耦合,最好將其刪除。

我對您的上下文以及您真正想要完成的建議現在可以選擇的其他方面知之甚少。但是,如果面板需要知道它所在的容器,那麼可能會有一些壞的設計與有害的耦合。