Java 不兼容JVM不发送WindowClosing事件的解决方法

Java 不兼容JVM不发送WindowClosing事件的解决方法,java,swing,hook,event-dispatch-thread,application-shutdown,Java,Swing,Hook,Event Dispatch Thread,Application Shutdown,不同OS X版本上的Apple JVM显然已经崩溃,因为它们不会在应该的时候生成WindowClosing事件(例如,如果您通过单击close按钮关闭应用程序的主JFrame) (在最新的Apple Java更新中,您可以设置一个属性来强制生成事件,但这不是我想要的) 我的问题很简单:我想在用户关闭应用程序时显示“提示”。但是,我无法(由于没有生成事件)检测到用户关闭了窗口 所以我想我可以用一个关机挂钩: Runtime.getRuntime().addShutdownHook(...) 然而

不同OS X版本上的Apple JVM显然已经崩溃,因为它们不会在应该的时候生成WindowClosing事件(例如,如果您通过单击close按钮关闭应用程序的主JFrame)

(在最新的Apple Java更新中,您可以设置一个属性来强制生成事件,但这不是我想要的)

我的问题很简单:我想在用户关闭应用程序时显示“提示”。但是,我无法(由于没有生成事件)检测到用户关闭了窗口

所以我想我可以用一个关机挂钩:

Runtime.getRuntime().addShutdownHook(...)
然而,显然从关闭挂钩创建JFrame似乎有问题:这就像调用关闭挂钩后EDT已经消失一样

我尝试了几种方法,但似乎没有什么真正有意义的:比如我的“提示”JFrame保持灰色(尽管它在除了关闭挂钩之外的任何地方调用时都可以正常工作),或者程序立即退出。我试着使用一个闩锁并等待来自关机挂钩的闩锁,但好像EDT已经不存在了

我目前正在认真考虑开发第二个Java应用程序,只是为了将工具提示显示为一种解决方法,但我认为这有点过火(但至少它可以工作)


有没有人尝试过从关闭钩子创建窗口并调用EDT上的东西?有没有需要注意的问题?(请记住,我无法可靠地捕获OS X上的窗口关闭事件,因为已知的Apple VM长期存在漏洞)。

如果窗口实际关闭,并且应用程序正在停止,则有东西正在调用JFrame.dispose()方法。覆盖此内容,并在其中添加代码

否则,您可以在窗口侦听器上添加侦听closed方法的守护进程线程,守护进程可以添加工具提示,然后处理窗口。您可以延迟dispose,直到工具提示完成


我从来没有听说过这个bug,但现在苹果没有发布自己的jdk,情况只能变得更好。

我不熟悉这个OS X bug。你对此有参考/链接吗?啊,当我关闭应用程序时,我最不想让它做的事情就是打开其他东西。@Dave Newton:关闭应用程序时弹出一个窗口是非常非常常见的。例如,您可能遇到软件弹出一个窗口,询问您“您没有保存文件xxx,您想在退出之前保存它吗”。@HovercraftFullOfEels:link比此处允许的注释长,但apple.eawt.quitStrategy可以在最近的apple JVM中实现这一点(再次说明,这不是我想要的)。实际上,苹果JVM充满了bug。这真是太疯狂了。Apple dev Java邮件列表是了解所有这些bug的好地方,老实说,它非常可怕。正如有人所写的“现在苹果没有发布自己的jdk,事情只能变得更好”。任何你可以使用的东西。