我有一定数量的按钮的Swing UI。一个按钮调用一个单独的挥杆类,并用新按钮和其他功能打开一个新窗口。现在,当我关闭此窗口时,原始窗口也将关闭。 我想这是因为两个类都impemented在Swing应用程序中的Swing弹出窗口
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
//some code
}
}
现在如何克服呢?代码示例或链接将非常有帮助。 谢谢
我有一定数量的按钮的Swing UI。一个按钮调用一个单独的挥杆类,并用新按钮和其他功能打开一个新窗口。现在,当我关闭此窗口时,原始窗口也将关闭。 我想这是因为两个类都impemented在Swing应用程序中的Swing弹出窗口
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
//some code
}
}
现在如何克服呢?代码示例或链接将非常有帮助。 谢谢
这是很难猜测没有看到代码。当窗口关闭时(也许是EXIT_ON_CLOSE
),您的JFrame
可能设置为setDefaultCloseOperation
以关闭应用程序。看看the java doc了解更多信息。
the java doc来自:
EXIT_ON_CLOSE
(在JFrame
定义):使用System exit
方法退出该应用程序。仅在应用程序中使用它。
这意味着整个应用程序将关闭。你不想为第二个窗口。你只是想要窗口(不是应用程序)关闭。
SwingUtilities.invokeLater
与应用程序关闭无关。它的目的是推迟run
方法调用到GUI线程完成绘画和处理当前事件的时间。
我建议你检查你的代码EXIT_ON_CLOSE
已经建议和System.exit()
调用。
要回答评论,由于您在两个框架上都设置了EXIT_ON_CLOSE
,因此在关闭任何框架时退出整个应用程序的预期行为。见Javadoc。
要解决您的问题,您需要在第二帧删除setDefaultCloseOperation
。
我同意其他人使用SwingUtilities.invokeLater
在主要Swing线程,EDT或Event Dispatch Thread上调用您的代码,这与您的问题无关,而且实际上是进入的好习惯if如果不这样做,您的代码可能会被取消EDT的风险。换句话说,如果您使用JButton的ActionListener中调用的代码显示另一个窗口,则不需要使用SwingUtilities.invokeLater
,因为在EDT上会调用actionPerformed方法。回到你手头的问题,我建议你让另一个窗口成为一个JDialog - 根据你的需要 - 或者是应用程序的模式,而不是JFrame,而不是JFrame。这样做可让您将对话框保留在主JFrame上方,并允许您在返回到主GUI之前强制用户处理对话,并在对话关闭时阻止应用程序关闭。
为了回答您的下一个问题,是的,JDialogs可以容纳复杂的GUI,就像任何JFrame一样复杂。
尝试在父JFrame上使用setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)
。
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)
将在最后一个JFrame关闭时终止应用程序,而EXIT_ON_CLOSE
将在该JFrame关闭后立即终止应用程序。
为什么这个问题被低估是超出我的。投票决定取消倒票。 – 2011-06-12 16:07:51
@ Hovercraft充满鳗鱼 - 感谢您的支持。 – JavaBits 2011-06-12 19:20:28