Я пытаюсь прослушать событие закрытия окна в родительском JFrame JPanel. В событии WindowClosing я хотел бы отменить регистрацию слушателя другого компонента.
К сожалению, единственный код, который я могу гарантировать, - это конструктор панели. Это означает, что сама панель еще не имеет окна предков, поэтому простой вызов SwingUtilities.getWindowAncestor не работает. Поэтому я регистрирую слушатель иерархии и в событииierarchyChanged ищем событие 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);
}
});
}
}
});
}
}
Это нормально? Есть ли более разумный способ получить указатель на событие закрытия кадра?