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

如何让Java程序等待用户关闭JDialog并实现AFK状态下的暂停?

解决方案

你不需要手动停止线程,Swing的模态JDialog本身就具备阻塞调用线程的特性,直到对话框被用户关闭后才会恢复线程执行。

你的代码问题分析

  1. 使用了已废弃的show()方法,Swing中标准做法是用setVisible(true)显示对话框。
  2. Thread.stop()是不安全且已被废弃的API,绝对不能使用。
  3. new MyFrame().isVisible()每次都会创建新的MyFrame实例,永远返回false,这个循环完全无效。

正确实现代码

直接利用模态对话框的阻塞特性即可,修改后的代码如下:

// 创建模态对话框(第三个参数true表示模态)
JDialog d = new JDialog(this, "Program stopped by AntyAFK procedure.", true);
d.setSize(300, 300);
// 设置对话框关闭规则,用户点击叉号时销毁对话框
d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
// 显示对话框,此时当前线程会被阻塞,直到用户关闭对话框
d.setVisible(true);

// 对话框关闭后,代码会继续执行到这里,程序恢复运行

补充说明

  • 模态对话框的setVisible(true)方法会阻塞调用它的线程,直到对话框被关闭(无论是点击关闭按钮、叉号还是调用dispose()/setVisible(false))。
  • 如果你的定时器是javax.swing.Timer,它的任务会自动在Swing事件调度线程(EDT)中执行,直接显示对话框没问题;如果用的是java.util.Timer,需要把显示对话框的逻辑放到EDT中执行,避免线程安全问题:
SwingUtilities.invokeLater(() -> {
    JDialog d = new JDialog(this, "Program stopped by AntyAFK procedure.", true);
    d.setSize(300, 300);
    d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    d.setVisible(true);
});

内容的提问来源于stack exchange,提问作者MiMaRz 97

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:15:54