我有一個關於swing組件快速初始化的問題。在我的swing應用程序開始時,我有一個彈出的按鈕,讓用戶可以做各種各樣的事情。有沒有辦法,我可以快速啓動第一個窗口,並在後臺加載其餘的UI(如其他框架和對話框),以便不存在最初的延遲。在後臺初始化Java Swing
謝謝,
我有一個關於swing組件快速初始化的問題。在我的swing應用程序開始時,我有一個彈出的按鈕,讓用戶可以做各種各樣的事情。有沒有辦法,我可以快速啓動第一個窗口,並在後臺加載其餘的UI(如其他框架和對話框),以便不存在最初的延遲。在後臺初始化Java Swing
謝謝,
真的沒有很好的解決方案,這是Java的缺點之一。這是說繼續閱讀我的想法。
加載類有兩部分。
你可以做一下rekin的建議,即在需要之前急切地加載UI類。這隻會部分解決你的問題,因爲你只是獲得一些課程。這也會有佔用更多內存的缺點,甚至在類加載器中的類將被垃圾收集(如果需要的話)。
爲了避免使用反射法獲得的一些麻煩。 您可以嘗試的一種方法是在您的窗口中確保構造函數不顯示窗口,而是使用另一種方法來顯示名爲init()的窗口,然後從主調用中單獨創建一個線程在每個Windows上創建一個新的方法你要預加載。
不要將參考保存到窗口。
在實際的代碼中,您可以調用構造函數,然後爲每個想要顯示的窗口調用init()。就性能而言,這會給你提供最好的場景,因爲現在你正在加載類以及運行構造函數代碼。當然,內存中程序的大小會變得臃腫。
public static void main(String [] args) {
// Construct main Frame on Swing EDT thread
Thread thread = new Thread() {
public void run() {
// now the background init stuff
new com.yourcompany.view.Dialog1();
new com.yourcompany.view.WizardGUI();
new com.yourcompany.view.SecondaryFrame();
// Here all the views are loaded and initialized
}
};
JFrame mainFrame = new JFrame();
mainFrame.setVisible();
// etc.
}
是的。伊什。你可以做類似於:
public static void main(String [] args) {
// Construct main Frame on Swing EDT thread
Runnable goVisible = new Runnable() {
public void run() {
JFrame mainFrame = new JFrame();
mainFrame.setVisible();
// etc.
}
};
SwingUtilities.invokeLater(goVisible);
// now the background init stuff
Class.forName("com.yourcompany.view.Dialog1");
Class.forName("com.yourcompany.view.WizardGUI");
Class.forName("com.yourcompany.view.SecondaryFrame");
// Here all the views are loaded and initialized
}
擺動線程安全嗎?
Swing不是線程安全的 – 2010-08-14 16:55:50
它不是線框,它可以在任何線程中創建組件,但只要首先顯示框架,所有對swing組件的訪問必須由swing事件處理線程完成。 – 2010-08-14 17:12:10
@MauricePerry:這曾經是真的,但它已不再(並且很長一段時間)。擺動文件說,組件必須始終在EDT中使用,無論它們是否可見。 – 2012-01-14 12:34:58
這是有一個閃屏(帶或不帶進度條 - 它好得多,當然)的goeal。你應該向用戶展示一個不錯的飛濺,然後在EDT線程的主窗口開始初始化所有組件,並在最後顯示你的框架。在EDT之外創建Swing組件可能(它肯定會)至少會在可見性方面造成問題,但也可能會在您的線程和EDT之間併發訪問。 不要這樣做,很難檢測到這些問題,它可能會在不同的硬件上隨機顯示。當然,如果你有一個進度條,你需要一些免費的EDT時間來渲染進度條的變化 - 實際上甚至是刷新啓動畫面本身(如果另一個應用程序阻塞一段時間,重新繪製背景圖片),你需要美國東部時間的空閒時間。
您應該將您的初始化劃分爲更小的塊,運行時間不會超過500毫秒,並使用SwingUtilities.invokeLater將它們安排在EDT上。
先顯示空白主框架,然後加載其餘的UI。當應用程序就緒(主框架可見) - Application.ready()方法時,您可以使用Swing應用程序框架(或現在的BSAF)來初始化組件並構建佈局。使用http://code.google.com/p/jbusycomponent/來顯示該應用程序正在加載...
是的,這工作得很好。 – Dave 2010-08-14 22:19:30
-1您應該使用invokeLater()。這是強烈建議,如果不這樣做可能會導致問題。 – Dimitry 2012-01-13 21:30:00
@ dk89 - 你誤讀了我想要做的事。我並不是說要在任何東西上創建主窗口,而是創建EDT,只是說他可以在後臺線程中實現一些小部件,對話框和輔助框架。 – 2012-01-14 22:16:20