以下是一些示例代码:
import javax.swing.*;
public class MyApplicatin {
public static void main(String args[]) {
JFrame window = new JFrame();
window.setSize(100,100);
window.setVisible(true);
System.out.println("Should terminate after printing this.");
}
}
为什么这个小应用程序在打印完最后一行后没有终止?
我的猜测是Swing启动了一个新的非守护程序线程。我正在阅读关于必须在一个单独的线程中使用Java的GUI内容,如果Swing已经使用了一个单独的线程,为什么有人会写这个呢?
答案 0 :(得分:8)
为什么要这样?通常,当您显示一个窗口时,您需要控制JVM何时退出。 JVM规范中没有任何内容表明JVM必须在main()
方法结束时退出。
Oracle有some documentation on this specific issue:
原因是AWT封装异步事件调度机制来处理AWT或Swing组件可以触发的事件。这种机器的确切行为取决于实现。特别是,它可以为其内部目的启动非守护程序帮助程序线程。实际上,这些是阻止上述示例退出的线程。
这个机器中的一个(三个)限制是这样的:
至少有一个活动的非守护程序线程,而应用程序中至少有一个可显示的AWT或Swing组件(参见
Component.isDisplayable
)。
这意味着只要有可显示的AWT / Swing组件,JVM就不会自行退出。
警告:处理所有可显示的组件不必然意味着非守护程序线程已消失:
如果所有组件都不可显示,则取决于实现是否以及何时终止非守护程序帮助程序线程。
答案 1 :(得分:3)
你必须添加
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.dispatchEvent(new WindowEvent(window, Event.WINDOW_DESTROY));
正如Joachim所说,处理窗口也可能起到作用,但这取决于实现。在任何情况下,您都必须关闭窗口,否则应用程序将继续运行。