2011-06-12 153 views
3

我有一定数量的按钮的Swing UI。一个按钮调用一个单独的挥杆类,并用新按钮和其他功能打开一个新窗口。现在,当我关闭此窗口时,原始窗口也将关闭。 我想这是因为两个类都impemented在Swing应用程序中的Swing弹出窗口

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

现在如何克服呢?代码示例或链接将非常有帮助。 谢谢

+1

为什么这个问题被低估是超出我的。投票决定取消倒票。 – 2011-06-12 16:07:51

+0

@ Hovercraft充满鳗鱼 - 感谢您的支持。 – JavaBits 2011-06-12 19:20:28

回答

7

这是很难猜测没有看到代码。当窗口关闭时(也许是EXIT_ON_CLOSE),您的JFrame可能设置为setDefaultCloseOperation以关闭应用程序。看看the java doc了解更多信息。

the java doc来自:

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

这意味着整个应用程序将关闭。你不想为第二个窗口。你只是想要窗口(不是应用程序)关闭。

+0

是的代码都有setDefaultCloseOperation(EXIT_ON_CLOSE),但它是为了关闭个别窗口。它是如何影响母亲的框架? – JavaBits 2011-06-12 19:19:47

+0

@JavaBits - 不要假设,猜测或发明行为(或者你想出了不正确的“单个窗口”的东西),而是仔细阅读api文档(如已经建议的) – kleopatra 2011-06-13 09:45:22

+0

@kleopatra - 它不可能读取该文件始终。否则,我们可以使用这个平台来分享问题。我想这个平台是首先创建的。 – JavaBits 2011-06-28 13:09:54

3

SwingUtilities.invokeLater与应用程序关闭无关。它的目的是推迟run方法调用到GUI线程完成绘画和处理当前事件的时间。

我建议你检查你的代码EXIT_ON_CLOSE已经建议和System.exit()调用。

要回答评论,由于您在两个框架上都设置了EXIT_ON_CLOSE,因此在关闭任何框架时退出整个应用程序的预期行为。见Javadoc

要解决您的问题,您需要在第二帧删除setDefaultCloseOperation

1

我同意其他人使用SwingUtilities.invokeLater在主要Swing线程,EDT或Event Dispatch Thread上调用您的代码,这与您的问题无关,而且实际上是进入的好习惯if如果不这样做,您的代码可能会被取消EDT的风险。换句话说,如果您使用JButton的ActionListener中调用的代码显示另一个窗口,则不需要使用SwingUtilities.invokeLater,因为在EDT上会调用actionPerformed方法。回到你手头的问题,我建议你让另一个窗口成为一个JDialog - 根据你的需要 - 或者是应用程序的模式,而不是JFrame,而不是JFrame。这样做可让您将对话框保留在主JFrame上方,并允许您在返回到主GUI之前强制用户处理对话,并在对话关闭时阻止应用程序关闭。

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

+0

我可以在JDialog中添加按钮和文本区域吗? – JavaBits 2011-06-12 19:17:31

+0

@JavaBits与JFrame的方式相同,更多信息请看http://download.oracle.com/javase/tutorial/uiswing/components/toplevel.html,不要忘记寻找toFront(),setAlwaysOnTop()和JDialog的Modalities,并尝试重用一个JDialog,只需更换它的内容,Hovercraft Full Of Eels +1 – mKorbel 2011-06-12 19:23:13

0

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

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