我有一定數量的按鈕的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