我的应用程序将以编程方式从一个主窗口切换到另一个主窗口(这意味着第一个窗口应该关闭,然后第二个窗口应该打开)。
切换应在ActionListener
对象中执行,该对象将添加到 window1 。这里的actionPerformed(ActionEvent e)
方法如下所示:
@Override
public void actionPerformed(ActionEvent e) {
WindowStarter.closeConfigWindow();
WindowStarter.openMainWindow();
}
其中closeConfigWindow()
是:
public static void closeConfigWindow() {
if (window1 != null)
window1.dispose();
}
在java-doc中,您可以找到与dispose()
类的Window
方法相关的以下信息:
注意:Java虚拟机中的最后一个可显示窗口 (VM)被丢弃,VM可以终止。请参阅AWT线程问题 了解更多信息
所以我的问题是:
当调用方法时,我是否冒险终止应用程序?
(因为:侦听器对象仅与 window1 的实例相关,在处置该窗口后,与该实例相关的所有对象都是&#34; off < / strong> JVM hook&#34;所以应用程序应该在理论上终止?)
或者反过来问:尽管如此,为什么申请没有终止?
提前致谢
答案 0 :(得分:1)
您可以设置JFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);并实现自己的WindowListener,以处理结束操作。
答案 1 :(得分:1)
如果您运行了非守护程序线程(main
或您创建的任何其他线程并且未将其设置为守护程序线程),则在使用{{1}关闭框架时,应用程序将不会终止设置为defaultCloseOperation
。
看一下documentation referred on Window API,它说:
如果您要求JVM在应用程序之后继续运行 使所有组件都无法显示你应该启动一个非守护进程 永远阻止的线程。
因此,在处理所有组件时退出应用程序取决于实现,
库可能会造成麻烦,您需要正确处理所有内容,它可以拥有
像this这样的陷阱,这个家伙从一个人那里打电话给DO_NOTHING_ON_CLOSE
守护程序线程,它阻止应用程序干净地退出。
但是,如果您运行了非守护程序线程,即使所有GUI都已处理,应用程序也不会退出。
答案 2 :(得分:0)
@ Jean Waghetti:感谢您的提示和信息!
使用发布的代码时,应用程序不会终止,因为基于AWT / Swing的应用程序终止的一个必要条件是,AWT-EventQueue为空。
这是关键的一段:
从1.4开始,修复后行为发生了变化 对于4030718.在目前的实施中,AWT终止了它的全部 帮助程序线程允许应用程序干净地退出时 以下三个条件是正确的:
There are no displayable AWT or Swing components. There are no native events in the native event queue. There are no AWT events in java EventQueues.
在我的情况下,调用window1.dispose();
不会立即终止,因为调用是由actionPerformed
方法完成的。通过这样做,EventQueue中将至少有一个Task,并且应用程序将完成此任务,即使在此任务期间处理了相关窗口(也可以调用此窗口的其他操作,即使它具有已经处理好了。)
此外:在AWT-Event中调用dispose()
(并且处理窗口是最后一个窗口)时,在程序关闭之前,最后一个任务完成后将有1000毫秒超时。 (相反:当通过“X”按钮关闭窗口时,程序立即终止。)
到目前为止......