我有一个具有一定数量按钮的Swing UI。一个按钮调用一个单独的swing类,并使用新按钮和其他功能打开一个新窗口。现在,当我关闭此窗口时,原始窗口也将关闭。 我认为这是因为这两个课程已经完成了
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
//some code
}
}
现在该如何克服这个问题?代码示例或链接将非常有用。 感谢
答案 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_CLOSE
和System.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关闭后立即终止该应用程序。