Swing应用程序中的Swing弹出窗口

时间:2011-06-12 14:22:32

标签: java swing

我有一个具有一定数量按钮的Swing UI。一个按钮调用一个单独的swing类,并使用新按钮和其他功能打开一个新窗口。现在,当我关闭此窗口时,原始窗口也将关闭。 我认为这是因为这两个课程已经完成了

javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
//some code
}
}

现在该如何克服这个问题?代码示例或链接将非常有用。 感谢

4 个答案:

答案 0 :(得分:7)

没有看到代码就很难猜到。也许您的JFrame setDefaultCloseOperation设置为在窗口关闭时关闭应用程序(可能是EXIT_ON_CLOSE)。有关详细信息,请查看the java doc

来自the java doc

  

EXIT_ON_CLOSE(在JFrame中定义):使用System exit方法退出应用程序。仅在应用程序中使用它。

这意味着整个应用程序将关闭。您不希望第二个窗口出现这种情况。您只想关闭窗口(而不是应用程序)。

答案 1 :(得分:3)

SwingUtilities.invokeLater与申请结束无关。其目的是将run方法调用推迟到GUI线程完成绘制和处理当前事件的时间。

我建议您按照已经建议的EXIT_ON_CLOSESystem.exit()来检查EXIT_ON_CLOSE的代码。

要回答评论,因为您在两个帧上都设置了setDefaultCloseOperation,所以当您关闭任何帧时退出整个应用程序是预期的行为。请参阅Javadoc

要解决您的问题,您需要在第二帧删除此{{1}}。

答案 2 :(得分:1)

我同意其他人的意见,通过使用SwingUtilities.invokeLater调用主Swing线程,EDT或事件调度线程上的代码与您的问题无关,事实上这是一个很好的习惯。 如果存在风险,如果不这样做,您的代码可能会被取消EDT。换句话说,如果您从JButton的ActionListener中调用的代码中显示其他窗口,则不需要使用SwingUtilities.invokeLater,因为将在EDT上调用actionPerformed方法。

回到你手头的问题,我建议你让另一个窗口成为JDialog - 或者是应用程序的模态还是不是,取决于你的需要 - 而不是JFrame。这样做可以让您将对话框保持在主JFrame之上,并允许您在返回主GUI之前强制用户处理对话框,并在对话框关闭时阻止应用程序关闭。

为了回答你可能的下一个问题,是的,JDialogs可以容纳复杂的GUI,就像任何JFrame一样复杂。

答案 3 :(得分:0)

尝试在父JFrame上使用setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)将在最后一个JFrame关闭时终止该应用程序,而EXIT_ON_CLOSE将在JFrame关闭后立即终止该应用程序。