在最后一个窗口调用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中设置断点)。
- 否则,请查看这些线程的堆栈帧,看看他们正忙着做什么