在最后一个窗口调用dispose后,java swing程序没有关闭

时间:2010-06-25 00:04:15

标签: java swing dispose shutdown

前言:这是我做过的第一个真正的挥杆计划。

我有一个swing程序,其中一个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)

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

谢谢:)

2 个答案:

答案 0 :(得分:4)

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

该文档有

  

注意:当Java虚拟机(VM)中的最后一个可显示窗口被丢弃时,VM 可能 终止。有关详细信息,请参阅AWT Threading Issues

您是否注意到可能

上面的链接提供了有关自动关机功能的详细信息。您可以阅读更多相关信息,或者只需将this.dispose()替换为System.exit(0)

即可解决此问题。

答案 1 :(得分:0)

此Pushing Pixels文章:AWT shutdown and daemon threads讨论了1.4中更改的AWT关闭行为。尽管如此,文章指出,要彻底关闭它可能会很棘手。

如果没有看到剩下的代码,我只能提供指针:

  • 确保没有其他未被处置的隐藏框架
  • 确保没有在AWT队列上生成消息(即在EventQueue中设置断点。)
  • 否则查看这些线程的堆栈帧并查看他们正忙着做什么