2011-06-12 157 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關閉後立即終止應用程序。