如何从代码中关闭 Java Swing 应用程序

2022-08-31 10:33:42

从代码中终止 Swing 应用程序的正确方法是什么,有哪些陷阱?

我试图在计时器触发后自动关闭我的应用程序。但是只是调用并没有解决问题 - 窗口消失了,但应用程序没有终止。但是,当使用关闭按钮关闭窗口时,应用程序会终止。我该怎么办?dispose()JFrame


答案 1

您的JFrame默认关闭操作可以设置为“”而不是(为什么人们继续使用EXIT_ON_CLOSE超出了我的范围)。DISPOSE_ON_CLOSEEXIT_ON_CLOSE

如果您有任何未释放的窗口或非守护程序线程,则应用程序不会终止。这应该被认为是一个错误(使用System.exit解决它是一个非常糟糕的主意)。

最常见的罪魁祸首是java.util.Timer和您创建的自定义线程。两者都应设置为守护程序,或者必须显式终止。

如果要检查所有活动帧,可以使用 Frame.getFrames()。如果释放了所有 Windows/框架,请使用调试器检查是否仍在运行的任何非守护程序线程。


答案 2

我猜是EXIT_ON_CLOSE

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

之前更好,因为您可以在实际离开应用程序之前编写一个窗口侦听器以进行一些清理操作。System.exit(0)

该窗口侦听器允许您定义:

public void windowClosing(WindowEvent e) {
    displayMessage("WindowListener method called: windowClosing.");
    //A pause so user can see the message before
    //the window actually closes.
    ActionListener task = new ActionListener() {
        boolean alreadyDisposed = false;
        public void actionPerformed(ActionEvent e) {
            if (frame.isDisplayable()) {
                alreadyDisposed = true;
                frame.dispose();
            }
        }
    };
    Timer timer = new Timer(500, task); //fire every half second
    timer.setInitialDelay(2000);        //first delay 2 seconds
    timer.setRepeats(false);
    timer.start();
}

public void windowClosed(WindowEvent e) {
    //This will only be seen on standard output.
    displayMessage("WindowListener method called: windowClosed.");
}

推荐