我读到应该使用DISPOSE_ON_CLOSE而不是EXIT_ON_CLOSE here并且感到困惑。如果应用程序没有其他活动线程/帧,setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)
是否会终止该应用程序?
我在another question a link登陆了一篇文章:
DISPOSE_ON_CLOSE - 自动隐藏和处置框架。当这是应用程序中唯一的帧时,VM也将被终止。
如果我假设应用程序在使用DISPOSE_ON_CLOSE
作为setDefaultCloseOperation()
的值时终止了,那么为什么单击退出按钮时下面的应用程序不会终止?
代码:
public class Test extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Test();
}
});
}
public Test() {
super();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setPreferredSize(new Dimension(250, 250));
pack();
setVisible(true);
}
}
更新
我目前正在运行Mac OS Yosemite,java -version
输出:
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
我在通常的IDE(Eclipse)和命令行上运行程序,但是在关闭JFrame之后,两者都保持JVM运行。
答案 0 :(得分:2)
JVM实际上终止了。当使用EXIT_ON_CLOSE
时JVM立即退出时会发生什么,当我使用DISPOSE_ON_CLOSE
时,终止(在我的机器上)最多需要15秒或更长时间。
我错误地认为JVM会像第一种情况一样立即终止,但显然情况并非如此。我不得不等待的最短时间是2秒,但通常需要5秒钟,这不断让我相信它不会终止,我会每次都强行终止JVM。
对我而言,这种行为感觉不正常,但我认为它对最终用户来说是完全透明的,因为单击退出按钮后JFrame
会关闭。
我没有解释为什么在这样一个最小的例子中,为{J}使用setDefaultCloseOperation()
的这些值是不同的。