为什么我的应用程序在关闭主窗口后仍然运行?

时间:2008-10-29 09:31:14

标签: java swing

如果我像这样制作一个JFrame

public static void main(String[] args) {

     new JFrame().setVisible(true);
}

然后在关闭窗口后,appication不会停止(我需要杀死它)。

显示应用程序主窗口的正确方法是什么?

我也想知道提出解决方案的原因。

提前致谢。

5 个答案:

答案 0 :(得分:20)

您应该在JFrame中调用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

示例代码:

public static void main(String[] args) {
    Runnable guiCreator = new Runnable() {
        public void run() {
            JFrame fenster = new JFrame("Hallo Welt mit Swing");
            fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fenster.setVisible(true);
        }
    };
    SwingUtilities.invokeLater(guiCreator);
}

答案 1 :(得分:3)

应用程序窗口和应用程序本身之间存在差异...窗口在其自己的线程中运行,如果其他线程仍处于活动状态,则完成main()将不会结束应用程序。关闭窗口时,您还应确保关闭应用程序,可能需要调用System.exit(0);

Yuval = 8 - )

答案 2 :(得分:3)

您必须处理框架,在窗口侦听器中调用dispose方法或使用setDefaultCloseOperation。对于最后一个的参数,您可以使用两个选项:

DISPOSE_ON_CLOSEEXIT_ON_CLOSE

DISPOSE_ON_CLOSE仅处理帧资源。

EXIT_ON_CLOSE处理帧资源,然后调用System.exit

除非你有非守护程序线程,否则它们之间没有真正的区别。 我更喜欢使用DISPOSE_ON_CLOSE,因为这样我就能注意到我是否忘记终止一个线程,因为如果没有更多线程在运行,JVM将会停止。这也是因为在没有处理的情况下关闭Frame将不会终止应用程序的原因,因为Swing创建了一个线程来处理仅在调用dispose时终止的事件。

答案 3 :(得分:0)

您可以将窗口侦听器设置为框架,以便程序在关闭后终止。

     frame.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
              System.exit(0);
          }
     }

答案 4 :(得分:0)

执行此操作的正确方法(除非您正在编写一个非常简单的单窗口应用程序,即没有其他窗口或线程等...)是捕获windowClosing()事件,然后调用{{ 1}}形式的方法。

如果您的程序在此之后没有完全退出,则意味着您正在运行其他非deamon线程,并且必须根据您的程序以您认为合适的方式停止这些线程。

调用dispose();System.exit()将强制停止任何其他线程(以及整个程序),这意味着您的代码不太可移植,并且强制停止线程显然是危险的(以编程方式)。