从ShutdownHook访问AWT

时间:2012-02-14 18:54:23

标签: java swing awt

我想提供一个非常简单的“你想保存这份文件吗?”关闭我的申请时的对话。

我使用WindowAdapter来执行此操作。如果使用任何GUI操作关闭应用程序(单击CLOSE按钮,从任务栏关闭,使用End Task从任务管理器关闭),这将完美地工作。

但是,当用户注销或终止应用程序进程时,JVM应用程序直接接收终止信号。它会关闭所有AWT资源而无需用户确认,也无需调用WindowAdapter。使用ShutdownHook,不可能进行任何GUI交互,因为AWT事件调度线程已经停止。

到目前为止,我找到了多种解决此问题的方法:

  • 使用JNI或JNA在到达AWT子系统之前捕获终止信号。
    • 每个操作系统都需要单独的代码。
  • 使用sun.misc.SignalHandler捕获终止信号。
    • 使用SUN专有界面。不保证可以在其他VM上运行。
  • 使用SWT在终止信号到达AWT子系统之前捕获终止信号。
    • 维护良好的界面,但我讨厌拉入SWT来解决这个小问题。
  • 将用户数据保存到临时文件,并在程序再次启动时处理清理。

还有另一种更好的解决方法吗?似乎很奇怪没有标准的方法来实现这么基本和基本的东西。我不能以某种方式再次启动AWT子系统吗?

2 个答案:

答案 0 :(得分:2)

主机平台拥有运行应用程序的JVM。在Mac OS X上,您可以使用OSXAdapter,讨论here。其他系统可能具有类似的机制。一个有用的防御措施是使用java.util.prefs.Preferences来记录清理信息。它独立于平台,典型的实现为给定平台提供尽力而为的保留。

答案 1 :(得分:1)

也许你复杂非常简单的想法,而不是终止当前的JVM实例

1)隐藏容器

2)保存应用程序属性,

3)关于异常显示JOptionPane有关于

的有意义的事情

4)调用System.exit(0);

5)一些最大的应用程序(用Embedded_database存储本地数据)在容器隐藏后几秒钟保存这些进程

0)或许help you this thread关于普通香草Java的解决方法