Как подключить JPanel к окну закрытия / закрытия родительского / родительского контейнера? - PullRequest
1 голос
/ 27 января 2010

Я хочу создать «универсальный» JPanel, который можно визуализировать в любом из классов Window более высокого уровня (JFrame, JDialog или JInternalFrame, если быть точным.)

Я хочу иметь возможность «очистить» некоторые статические значения, когда это окно больше не отображается на экране. Обычно я делаю это с классом Window (например, JFrame) и просто addWindowListener с надлежащими windowClosing или windowClosed методами во время создания JFrame.

Поскольку я хочу, чтобы какой-либо из классов Window мог это отобразить, я даже не знаю, какой тип слушателя добавить, и не знаю, к какому окну добавить его.

Есть ли способ «зацепить» реализацию и рендеринг JPanel, чтобы я мог добавить свои ловушки отключения независимо от того, какой класс Window его отображает?

(Я смотрел на PropertyChangeListener, но componentShown не срабатывает при JPanel рендеринге.)

Буду признателен за любую помощь.

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Ну, у меня наконец-то получилось, но я не уверен, что мне действительно нравится ответ.

Я добавил AncestorListener к JPanel при создании. Этот слушатель заглушил события ancestorRemoved и ancestorMoved и в событии ancestorAdded подключил бы getTopLevelAncestor() к соответствующему WindowListener / InternalFrameListener, чтобы я мог запустить код завершения работы при закрытии окна.

Если есть лучший способ, я открыт для этого. (Я собираюсь рассмотреть HierarchyListener от Джеффа.)

0 голосов
/ 27 января 2010

Есть несколько различных вариантов в зависимости от желаемой семантики. Вы можете зарегистрировать ComponentListener и обработать метод componentHidden. Другая возможность - зарегистрировать HierarchyListener и проверить наличие DISPLAYABILITY_CHANGED событий. Вы также можете использовать HierarchyListener, чтобы узнать, когда панель была добавлена ​​или удалена из контейнера, и добавить / удалить прослушиватели окна из старого и нового окна. Разница между ComponentListener и HierarchyListener заключается в том, что ComponentListener вызывается любым изменением видимости, в то время как событие HierarchyListener / DISPLAYABILITY_CHANGED запускается, когда окно панели располагается. ComponentListener, вероятно, ваш лучший выбор, но имейте в виду, что панель может снова стать видимой в будущем.

Вы также можете попробовать событие AncestorListener ancestorRemoved. Он вызывается, если сам компонент или любой из его предков сделан невидимым.

...