如何让Java程序等待用户关闭JDialog并实现AFK状态下的暂停?
解决方案
你不需要手动停止线程,Swing的模态JDialog本身就具备阻塞调用线程的特性,直到对话框被用户关闭后才会恢复线程执行。
你的代码问题分析
- 使用了已废弃的
show()方法,Swing中标准做法是用setVisible(true)显示对话框。 Thread.stop()是不安全且已被废弃的API,绝对不能使用。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
相关产品推荐
相关产品推荐

