代码之家  ›  专栏  ›  技术社区  ›  Łukasz Bownik

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

  •  14
  • Łukasz Bownik  · 技术社区  · 16 年前

    如果我做这样的JFrame

    public static void main(String[] args) {
    
         new JFrame().setVisible(true);
    }
    

    然后在关闭窗口后,应用程序不会停止(我需要终止它)。

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

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

    事先谢谢。

    5 回复  |  直到 8 年前
        1
  •  20
  •   Enamul Hassan    10 年前

    你应该打电话给 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 在你的JFrand中。

    示例代码:

    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);
    }
    
        2
  •  3
  •   Yuval    16 年前

    应用程序窗口和应用程序本身有区别…窗户在自己的线程中运行,并完成 main() 如果其他线程仍处于活动状态,则不会结束应用程序。关闭窗口时,还应确保关闭应用程序,可能通过调用 System.exit(0);

    尤瓦尔=8)

        3
  •  3
  •   giannis christofakis    11 年前

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

    DISPOSE_ON_CLOSE EXIT_ON_CLOSE .

    关闭时处理 只处理框架资源。

    EXITION ONSEL 释放框架资源,然后调用 System.exit .

    除非您有非守护进程线程,否则这两者之间没有真正的区别。 我更喜欢使用 关闭时处理 因为这样我就能够注意到如果忘记终止一个线程,因为如果没有更多的线程在运行,JVM就会停止。这也是关闭帧而不释放不会终止应用程序的原因,因为Swing创建了一个线程来处理仅在调用Dispose时终止的事件。

        4
  •  0
  •   giannis christofakis    11 年前

    你可以设置一个 窗口侦听器 以使程序在关闭后终止。

         frame.addWindowListener(new WindowAdapter() {
              public void windowClosing(WindowEvent e) {
                  System.exit(0);
              }
         }
    
        5
  •  0
  •   Steve Smith    8 年前

    正确的方法是捕获 windowClosing() 事件,然后调用 dispose(); 窗体的方法。

    如果在此之后您的程序没有完全退出,这意味着您有其他非守护者线程在运行,并且您必须根据您的程序尽可能地停止这些线程。

    打电话 System.exit() setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 将强制停止任何其他线程(以及整个程序),这意味着您的代码不易移植,强制停止线程显然是危险的(以编程的方式)。