Java 在shutdownHook中添加Joptionpane

Java 在shutdownHook中添加Joptionpane,java,Java,有没有办法在shutdownhook中显示joptionpane i、 e我需要在我的shutdownhook事件中显示confirmdailog如果有,它对您没有帮助 作为JVM关闭的一部分,关闭挂钩是异步调用的,因此“确认”对话框不会真正确认任何内容,因为您无法停止或反转关闭过程。当用户完成程序但尚未执行某些提交操作时,您似乎希望得到某种提示(使用未保存的更改关闭文档)。如果是这种情况,我会在窗口上放置一个WindowListener,该窗口的关闭将触发提示并覆盖windowClosing(

有没有办法在shutdownhook中显示joptionpane
i、 e我需要在我的shutdownhook事件中显示confirmdailog

如果有,它对您没有帮助


作为JVM关闭的一部分,关闭挂钩是异步调用的,因此“确认”对话框不会真正确认任何内容,因为您无法停止或反转关闭过程。

当用户完成程序但尚未执行某些提交操作时,您似乎希望得到某种提示(使用未保存的更改关闭文档)。如果是这种情况,我会在窗口上放置一个WindowListener,该窗口的关闭将触发提示并覆盖windowClosing(WindowEvent e){…}以显示您的JOptionPane。根据JavaDocs,此时可以覆盖windowClosing。这使您有机会对具有未保存更改的文档进行“保存、放弃、取消”诊断日志。

我怀疑您想要的不是关机挂钩,而是“真的退出?”作业窗格。如果是这样的话,下面是一个如何做到这一点的示例:

import javax.swing.*;
import java.awt.event.*;

public class ConfirmToCloseTest {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                final JFrame frame = new JFrame();
                frame.addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                        if (JOptionPane.showConfirmDialog(frame, "Really quit?", "", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                            System.exit(0);
                        }
                    }
                });
                frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                frame.getContentPane().add(new JLabel("Hello world"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

关机挂钩应该能够快速执行。等待用户做出决定并不是关机挂钩的目的。交互式程序中的关机挂钩没有意义。关闭挂钩的实际用例是在JVM异常终止时释放资源和其他内务管理

好的,你可以通过让一个线程
wait()
永远等待()来防止JVM实际终止,但是对了,你不能阻止已经在运行的关机当用户注销导致JVM关闭时,这是不可能做到的。AWT子系统将关闭,对此您无能为力。