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);
}
});
}
}
});
}
}
這是理智?是否有更合理的方法來處理關門事件?