java - 如何确保在关闭 Java 桌面应用程序时执行任务?

标签 java swing

<分区>

这是一个“最佳实践”类型的问题。据我所知,当需要在 JVM 关闭之前执行任务时,有两种方法(可能还有更多……):

  1. 向容器添加一个WindowListener 并覆盖windowClosing 事件
  2. 添加一个关闭钩子(Hook)(即 Runtime.addShutdownHook )

对于 Java 桌面应用程序,哪种方法是“首选”方法?有“首选”方式吗?

最佳答案

不是最佳实践,也不是首选方式,只是关闭当前 JVM 实例,非常简单,

1) Top-LevelContainer#setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

2) 添加WindowListener

     WindowListener exitListener = new WindowAdapter() {

        @Override
        public void windowClosing(WindowEvent e) {
            int confirm = JOptionPane.showOptionDialog(null, 
                  "Are You Sure to Close Application?", "Exit Confirmation", 
                  JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, 
                  null, null, null);
            if (confirm == JOptionPane.YES_OPTION) {
                Top-LevelContainer#setVisible(false);
                // clean-up everything 

                // on error display  JOptionPane with error mgs but from
                // another JVM instance, e.g.jar file, see add 3.)
                System.exit(1); //in some cases not works System.exit(0);
            }
     }

3) here剩下的就是如何显示来自另一个新 JVM 实例的错误消息

关于java - 如何确保在关闭 Java 桌面应用程序时执行任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903333/

相关文章:

Java - 如何使JFrame的内容出现在同一个窗口而不是多个窗口中

java - 无法使用 Java 代码从组合框中获取选定的值

java - 组布局错误: can't find wrong line

java - 当添加透明度时,为什么透明JButton会显示框架图像?

java - 如何在 Tab 键时选择 JTextField 中的文本

java - 我应该在我的应用程序中声明 swing 组件为最终的吗?

java - 如何从 vector 内的数组中读取?

java - 如何更改(数据库)变量中的 jspinner 日期最小值和最大值?

java - 在 Tomcat 上处理 URI 中的字符编码

java - 无法在recyclerview(cardview)上设置onclick