我是否有可能通过关闭并打开java swing中的不同窗口来终止应用程序?

时间:2014-11-11 13:52:44

标签: java swing jframe

我的应用程序将以编程方式从一个主窗口切换到另一个主窗口(这意味着第一个窗口应该关闭,然后第二个窗口应该打开)。

切换应在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;所以应用程序应该在理论上终止?)
或者反过来问:尽管如此,为什么申请没有终止?

提前致谢

3 个答案:

答案 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”按钮关闭窗口时,程序立即终止。)

到目前为止......