java如何在关机挂钩中使用swing?
是否有任何可能的方法将swing添加到关闭挂钩中(即,在VM关闭时显示一个弹出窗口)
我意识到,如果我尝试创建一个新的JFrame,它会给我一个错误,因为它试图注册一个关闭钩子,但失败了,因为VM已经关闭了。我只是想知道是否真的有办法解决这个问题
你可以在下面搜索框中键入要查询的问题!
是否有任何可能的方法将swing添加到关闭挂钩中(即,在VM关闭时显示一个弹出窗口)
我意识到,如果我尝试创建一个新的JFrame,它会给我一个错误,因为它试图注册一个关闭钩子,但失败了,因为VM已经关闭了。我只是想知道是否真的有办法解决这个问题
# 1 楼答案
Swing GUI必须在Event Dispatch Thread上完成,然后
在Initial Thread上创建JDialog or JOptionPane
显示容器
呼吁
Shutdown Hook
Simple way,但需要最终用户操作(关闭
JDialog
)# 2 楼答案
你真的不该这么做。从the ^{} specification
此处的具体警告建议您不要这样做:
“关机挂钩也应该很快完成工作。”
依赖任何可能需要一段时间才能完成工作的东西,或者无限期地阻止用户输入,比如
JOptionPane
对话框,都不是你应该在关闭钩子中做的事情“尝试使用其他基于线程的服务,例如AWT事件调度线程,可能会导致死锁”
Swing运行在AWT之上,AWT的底层事件调度线程也可能正在关闭。在关机时尝试使用Swing或AWT不仅会导致死锁,而且可能根本不起作用
“如果虚拟机中止,则无法保证是否会运行任何关机挂钩”
不能保证你的用户甚至可能收到你的消息,因为关机挂钩只保证在它正常退出或终止时运行--而不是在停止或中止时运行
# 3 楼答案
我不确定你的问题,但我认为当JVM关闭时,不可能运行或显示弹出窗口。就像你在准备睡觉的时候试着跑步?只是猜测而已。:)
# 4 楼答案
如果有的话,对你没有帮助
关闭钩子是作为JVM关闭的一部分异步调用的,因此“确认”对话框不会真正确认任何内容,因为您无法停止或反转关闭过程。等待用户做出决定并不是关机挂钩的目的。交互式程序中的关机挂钩没有意义。 关机挂钩的真正用途是:
还需要注意的是,关闭钩子不会一直运行,更多信息请参见我的答案:How to shutdown java application correctly from C# one