You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX中点击窗口关闭按钮(X)时如何阻止窗口关闭?

如何阻止JavaFX窗口点击关闭按钮直接关闭?

要实现点击窗口右上角关闭按钮(X)时不直接关闭窗口,我们可以通过拦截窗口的关闭请求,弹出确认对话框让用户决定是否真的退出。下面是具体的实现思路和修正后的代码:

首先,给JavaFX的Stage设置setOnCloseRequest事件处理器,这个处理器会在用户尝试关闭窗口时被触发。我们可以在这个方法里先阻止默认的关闭行为,再弹出确认弹窗,根据用户的选择来决定是否真正关闭窗口。

这里需要注意原代码里的一个小错误:判断用户选择的分支中,else if的条件重复写成了buttonTypeOne,应该改成buttonTypeTwo,否则逻辑会出错。修正后的完整代码如下:

stage.setOnCloseRequest((WindowEvent t) -> {
    // 先拦截默认的关闭行为
    t.consume();
    
    Alert alert = new Alert(AlertType.CONFIRMATION);
    alert.setTitle("Attention");
    alert.setContentText("Would you close the application?");
    
    ButtonType buttonTypeOne = new ButtonType("Yes");
    ButtonType buttonTypeTwo = new ButtonType("No");
    alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo);
    
    Optional<ButtonType> result = alert.showAndWait();
    if (result.isPresent()) {
        if (result.get() == buttonTypeOne) {
            // 用户选择Yes,手动关闭窗口
            stage.close();
        } else if (result.get() == buttonTypeTwo) {
            // 用户选择No,不执行关闭操作
        }
    }
});

代码细节说明:

  • t.consume():调用这个方法会"消费"当前的关闭事件,阻止窗口默认的关闭逻辑,让我们完全掌控后续流程。
  • 自定义Alert按钮:替换默认的确认按钮为"Yes"和"No",让用户的选择更直观。
  • alert.showAndWait():以模态方式显示对话框,必须等用户做出选择后才会继续执行后续代码。
  • 分支逻辑:如果用户点击"Yes",就手动调用stage.close()关闭窗口;如果点击"No",则什么都不做,窗口保持打开状态。

内容的提问来源于stack exchange,提问作者Isacco Trevisan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:40:12