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

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

我有一个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) 

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

谢谢 :)

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

该文件有一个

注意:当Java虚拟机(VM)中的最后一个可显示窗口被丢弃时,VM 可能会终止。 有关更多信息,请参阅AWT线程问题 。

你注意到了吗?

上面的链接为您提供有关自动关闭function的详细信息。 你可以阅读更多相关内容,或者你可以通过用System.exit(0)替换this.dispose()来解决这个问题。

这篇Pushing Pixels文章: AWT关闭和守护程序线程讨论了1.4中更改的AWT关闭行为。 尽管如此,文章指出,要彻底关闭它可能会很棘手。

没有看到其余的代码,我只能提供指针:

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