Я использую следующий код, чтобы позволить моему компоненту регистрировать/отменять регистрацию событий, когда он добавлен/удален соответственно.Swing AncestorListener: Не запускать для переключения вкладок?
addAncestorListener(new AncestorListener() {
@Override public void ancestorRemoved(AncestorEvent event) {
log.info("========= Remove listeners by " + ContentViewingComponent.this);
...
}
@Override public void ancestorMoved(AncestorEvent event) {}
@Override public void ancestorAdded(AncestorEvent event) {
log.info("========= Add listeners by " + ContentViewingComponent.this);
...
}
});
Моя цель в том, что оба события (добавлять и удалять) будет в основном стрелять один раз в большинстве случаев, то есть при создании компонента & добавляется и когда он удален & забыл.
Однако выясняется, что они также запускаются, когда вкладка (JTabbedPane
), в которой находится этот компонент, выбрана/скрыта. Есть ли способ обходить/обнаруживать это?
Возможно, версия Обновление: больше исследований показывает, что компонент фактически не удален, но скрытая вкладка и JTabbedPane
, использующая отображение/скрытие вместо добавления/удаления?ancestorRemoved()
тоже срабатывает. Я могу определить, есть ли у компонента еще один корень * и игнорировать событие, если он есть, но проблема в том, что он не будет запущен снова, когда компонент фактически будет удален (пока он невидим).
* Ну, это еще предстоит выяснить. Оказывается, Обновление: Исправлено, проверив его на один шаг позже, используя ancestorRemoved()
срабатывает перед фактическим удалением, поэтому я не могу подойти к цепи getParent()
, чтобы узнать, имеет ли компонент корень.SwingUtilities.invokeLater()
.
(Для тех, кто знаком с Flash/AS3, я ищу для свинг эквивалента ADDED_TO_STAGE
/REMOVED_FROM_STAGE
событий.)
Слушатели качаются при стрельбе. Однако вы можете использовать операторы if в вашем слушателе для выполнения кода только для тех событий, которые вы хотите. –
@ GilbertLeBlanc Да, но есть проблема. Я могу игнорировать событие, которое просто означает «невидимое», но если компонент затем удаляется (хотя и невидим), он не дает мне знать. –