System Exit 上的 JavaFX 令人困惑的事件处理

JavaFX confusing event handling on System Exit

下面的代码生成一个带有两个按钮的警告对话框,确定取消;它也按预期工作:如果我单击“确定”,系统将退出,否则对话框将消失。

奇怪的是:如果我省略处理事件的 else 块,平台将始终退出,而不考虑我单击的按钮。

这真的是预期的行为吗?我错过了什么吗?

private void setCloseBehavior() 
{
    stage.setOnCloseRequest((WindowEvent we) -> 
    {
        Alert a = new Alert(Alert.AlertType.CONFIRMATION);
        a.setTitle("Confirmation");
        a.setHeaderText("Do you really want to leave?");                      
        a.showAndWait().ifPresent(response -> {
            if (response == ButtonType.OK) {
                Platform.exit();
            } else {
                we.consume();
            }
        });
    });
}

这是 windows.onCloseRequest 的文档:

Called when there is an external request to close this Window. The installed event handler can prevent window closing by consuming the received event.

因此,如果您不在关闭请求处理程序中使用关闭请求事件,则会发生默认行为(window 将关闭)。

您实际上不需要在关闭请求处理程序中调用 Platform.exit(),因为默认行为是退出,因此您可以简化您的逻辑。如果用户没有确认他们要关闭,你只需要消费关闭请求事件:

stage.setOnCloseRequest((WindowEvent we) -> 
{
    Alert a = new Alert(Alert.AlertType.CONFIRMATION);
    a.setTitle("Confirmation");
    a.setHeaderText("Do you really want to leave?");   
    Optional<ButtonType> closeResponse = alert.showAndWait();
    if (!ButtonType.OK.equals(closeResponse.get())) {
        we.consume();
    }                   
});

相关 Whosebug 问题的答案中有一个类似的完全可执行示例:

  • .