0

各种 OS X 版本上的 Apple JVM 显然已被破坏,因为它们不会在应该生成 WindowClosing 事件时(例如,如果您通过单击关闭按钮关闭应用程序的主 JFrame)。

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

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

所以我想我可以使用关闭钩子:

Runtime.getRuntime().addShutdownHook(...)

然而,显然从关闭挂钩创建 JFrame 似乎有问题:就像一旦调用关闭挂钩,EDT 就已经消失了。

我尝试了几件事,但似乎没有什么真正有意义:就像我的“提示”JFrame 保持灰色(尽管从任何地方调用它时它工作正常,但关闭挂钩)或程序立即退出。我尝试使用闩锁并等待关闭挂钩的闩锁,但就好像 EDT 不再存在一样。

我目前正在认真考虑生成第二个 Java 应用程序只是为了将工具提示显示为一种解决方法,但我认为这有点矫枉过正(但至少它会起作用)。

有没有人尝试过从关闭挂钩创建一个窗口并在 EDT 上调用一些东西,并且有什么需要注意的问题吗?(请记住,由于已知的长期存在的 Apple VM 错误,我无法可靠地捕获 OS X 上的窗口关闭事件)。

4

1 回答 1

1

如果窗口实际上正在关闭并且应用程序正在停止,那么某些东西正在调用 JFrame.dispose() 方法。覆盖它,并在那里添加您的代码。

否则你可以在窗口监听器上添加一个监听关闭方法的守护线程,守护进程可以添加工具提示然后处理窗口。您可以延迟处置,直到工具提示完成。

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

于 2011-10-13T05:18:46.647 回答