【问题标题】:Why won't this application terminate with DISPOSE_ON_CLOSE?为什么此应用程序不会以 DISPOSE_ON_CLOSE 终止?
【发布时间】:2015-05-22 00:27:22
【问题描述】:

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

【问题讨论】:

  • “setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) 如果没有其他活动线程/帧,是否会终止应用程序?” - 是的,这是测试是否存在的好方法任何胭脂(非守护进程)线程
  • 发生了什么?这是一个例外,还是什么都没有发生?框架真的关闭了吗?
  • 另外,您的测试代码对我来说工作正常(JVM 在框架关闭后终止)
  • 没有例外。 JFrame 关闭,但应用程序并未终止。
  • 你的代码对我来说工作正常,JVM按预期退出。

标签: java swing


【解决方案1】:

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

我无法解释为什么在这样一个最小的示例中为 JVM 使用 setDefaultCloseOperation() 的这些值会有所不同。

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 2011-02-28
    • 2017-07-03
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多