Я наконец-то нашел полуудовлетворительный способ решения проблемы, используя порядок событий в JavaFX, поэтому я публикую его как ответ на случай, если он может помочь другим.
Когда окно w1 закрывается, фокусируясь на окне w2, порядок событий следующий:
- w1 получает событие WINDOW_HIDING
- w2 focusProperty изменяется на true
- w1 получает событие WINDOW_HIDDEN
Итак, я написал следующий код, чтобы я мог знать, исходит ли фокус от внутреннего окна:
public class MainStage {
private Stage primaryStage;
private AtomicBoolean triggerEventOnFocusGain = new AtomicBoolean(true);
...
primaryStage.focusedProperty.addListener((prop, oldVal, newVal) -> {
if(newVal.booleanValue() && triggerEventOnFocusGain.get()) {
doStuff();
}
});
}
public class SomeDialog {
private MainStage mainStage;
private Window dialogWindow;
...
dialogWindow.addEventHandler(WindowEvent.WINDOW_HIDING, event ->
mainStage.setTriggerEventOnFocusGain(false));
dialogWindow.addEventHandler(WindowEvent.WINDOW_HIDDEN, event ->
mainStage.setTriggerEventOnFocusGain(true));
}
Единственная проблема заключается в том, что я должен сделать это для всех внутренних окон / диалогов.
В моем случае я в конечном итоге решил, что могу сделать это только для нескольких диалогов, для которых запуск события будет проблематичным, и игнорировать другие.
Другим способом, конечно, было бы введение общего абстрактного родителя всех моих классов представлений, который выполняет приведенный выше код.