Прикрепить к окну события из JPanel - PullRequest
4 голосов
/ 12 февраля 2011

Я пытаюсь прослушать событие закрытия окна в родительском 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);
                        }
                    });
                }
            }
        });
    }
}

Это нормально? Есть ли более разумный способ получить указатель на событие закрытия кадра?

1 Ответ

3 голосов
/ 12 февраля 2011

Это не самое уродливое, что я видел (я бы даже не сказал, что все так плохо), но вы должны спросить себя: почему ваша панель действительно должна знать, когда окнозакрыто?Это кажется странной связью, которую лучше всего удалить.

Я недостаточно знаю о вашем контексте и о том, что вы действительно пытаетесь достичь, чтобы предложить альтернативу прямо сейчас.Но если панели нужно знать о контейнере, в котором она находится, вероятно, существует некая плохая конструкция с вредной связью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...