为什么此应用程序不会以DISPOSE_ON_CLOSE终止?

时间:2015-05-22 00:27:22

标签: java swing

我读到应该使用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运行。

1 个答案:

答案 0 :(得分:2)

JVM实际上终止了。当使用EXIT_ON_CLOSE时JVM立即退出时会发生什么,当我使用DISPOSE_ON_CLOSE时,终止(在我的机器上)最多需要15秒或更长时间。
我错误地认为JVM会像第一种情况一样立即终止,但显然情况并非如此。我不得不等待的最短时间是2秒,但通常需要5秒钟,这不断让我相信它不会终止,我会每次都强行终止JVM。
对我而言,这种行为感觉不正常,但我认为它对最终用户来说是完全透明的,因为单击退出按钮后JFrame会关闭。

我没有解释为什么在这样一个最小的例子中,为{J}使用setDefaultCloseOperation()的这些值是不同的。