Закрытие окна (с помощью dispose()
) и скрытие его (с помощью setVisible(false)
) - это разные операции, которые вызывают разные события, а закрытие его из операционной системы - это еще одна другая операция, которая создает еще одно другое событие.
Все три будут выдавать windowDeactivated
, сообщая о потере фокуса окна, но dispose()
будет выдавать windowClosed
, а при закрытии из ОС сначала выдает windowClosing
. Если вы хотите обрабатывать оба этих параметра одинаково, вы можете установить окно, которое будет закрыто:
window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Как правило, setVisible(false)
подразумевает, что вы можете захотеть снова использовать окно, поэтому оно не публикует никаких событий окна (кроме windowDeactivated
). Если вы хотите обнаружить скрытие окна, вам нужно использовать ComponentListener
;
window.addComponentListener(new ComponentAdapter() {
@Override
public void componentHidden(ComponentEvent e) {
System.out.println("componentHidden()");
}
})
Обратите внимание, что это в значительной степени будет работать только для явных вызовов setVisible()
. Если вам нужно обнаружить скрытие более широко, вы можете использовать HierarchyListener
, но это, вероятно, больше проблем, чем стоит.
window.addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
System.out.println("valid: " + window.isValid());
System.out.println("showing: " + window.isShowing());
}
});
Обратите внимание, что когда вы располагаете окном, вы получаете пару HierarchyEvent
с, сначала для сокрытия, а затем для аннулирования, но когда вы скрываете его с помощью setVisible()
, оно все еще действует, поэтому вы не получите недействительности.