我终于找到了一种半满意的方法来处理这个问题,使用JavaFX中的事件顺序,所以我把它作为一个答案发布,以防它可以帮助其他人。
当窗口 w1 关闭,将焦点提供给窗口 w2 时,事件顺序如下:
- w1 接收事件WINDOW_HIDING
- w2 焦点属性更改为 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));
}
唯一的问题是我必须对所有内部窗口/对话框执行此操作。
就我而言,我最终决定,我只能为少数几个对话而离开,对于这些对话来说,触发事件将是有问题的,并忽略其他对话。
当然,另一种方法是引入执行上述代码的所有视图类的公共抽象父级。