【问题标题】:java swing program not closing after dispose is called on last window在最后一个窗口上调用 dispose 后 java swing 程序未关闭
【发布时间】:2011-03-08 02:01:03
【问题描述】:

前言:这是我做的第一个真正的摇摆程序。

我有一个摇摆程序,其中一个 JButton 应该退出程序。该按钮触发 this.dispose();。当我单击这个 JButton 时,它确实 使窗口完全消失,但查看调试器,程序本身仍在运行。

我的主要方法只包括:

public static void main (String[] args)
{
  java.awt.EventQueue.invokeLater(new Runnable()
  {
    public void run()
    {
      new StartupGui().setVisible(true);
    }
  });
}

我的退出按钮看起来像操作按钮的样子:

private void exitButtonActionPerformed(java.awt.event.ActionEvent evt)
{
  this.dispose();
}

我也试过这个退出按钮:

private void exitButtonActionPerformed(java.awt.event.ActionEvent evt)
{
  java.awt.EventQueue.invokeLater(new Runnable()
  {
    public void run()
    {
      dispose();
    }
  });
}

按下退出按钮后查看调试器,我看到以下内容(并且只有以下内容):

Daemon Thread [AWT-XAWT] (running)
Thread [AWT-Shutdown] (running)
Thread [AWT-EventQueue-0] (running)
Thread [DestroyJavaVM] (running)

谁能指出我正确的方向,为什么程序在此之后没有关闭?我已经做了一些谷歌搜索,但到目前为止还没有到达任何地方。如果您需要更多信息,请告诉我

谢谢:)

【问题讨论】:

  • 你运行的是什么版本的jdk?旧版本在处理所有窗口时不会关闭。
  • $java -version 产生“build 1.6.0_20-b02”。我在 64 位 Arch Linux 机器上运行它。

标签: java swing dispose shutdown


【解决方案1】:

因为dispose() 方法只释放资源。

文档有一个

注意:当 Java 虚拟机 (VM) 中的最后一个可显示窗口被释放后,VM可能终止。请参阅AWT Threading Issues 了解更多信息。

你注意到可能了吗?

上面的链接为您提供了关于自动关机功能的详细信息。您可以阅读更多相关信息,或者您可以通过将this.dispose() 替换为System.exit(0) 来解决此问题

【讨论】:

    【解决方案2】:

    这篇推送像素文章:AWT shutdown and daemon threads 讨论了在 1.4 中更改的 AWT 关闭行为。不过,文章指出,彻底关机可能很棘手。

    没有看到剩下的代码,只能指点一下:

    • 确保没有其他未处理的隐藏帧
    • 确保 AWT 队列上没有生成任何消息(即在 EventQueue 中设置断点。)
    • 否则查看这些线程的堆栈帧,看看它们在忙什么

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多