2010-08-14 54 views
0

我有一個關於swing組件快速初始化的問題。在我的swing應用程序開始時,我有一個彈出的按鈕,讓用戶可以做各種各樣的事情。有沒有辦法,我可以快速啓動第一個窗口,並在後臺加載其餘的UI(如其他框架和對話框),以便不存在最初的延遲。在後臺初始化Java Swing

謝謝,

回答

0

真的沒有很好的解決方案,這是Java的缺點之一。這是說繼續閱讀我的想法。

加載類有兩部分。

  1. 當需要時,JVM會將Class文件加載到類加載器 中。
  2. JIT在第一次運行路徑時編譯和優化 代碼。

你可以做一下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. 
} 
+0

是的,這工作得很好。 – Dave 2010-08-14 22:19:30

+2

-1您應該使用invokeLater()。這是強烈建議,如果不這樣做可能會導致問題。 – Dimitry 2012-01-13 21:30:00

+0

@ dk89 - 你誤讀了我想要做的事。我並不是說要在任何東西上創建主窗口,而是創建EDT,只是說他可以在後臺線程中實現一些小部件,對話框和輔助框架。 – 2012-01-14 22:16:20

1

是的。伊什。你可以做類似於:

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 
} 
+0

不幸的是,我不斷收到Nimbus UI的ConcurrentModificationException異常。不知道爲什麼。 – Dave 2010-08-14 16:30:50

+0

你可以發佈堆棧跟蹤嗎? – Rekin 2010-08-14 16:40:35

+0

擺動不是線程安全的。應該有一個線程提供gui。 – extraneon 2010-08-14 16:56:27

1

擺動線程安全嗎?

+2

Swing不是線程安全的 – 2010-08-14 16:55:50

+1

它不是線框,它可以在任何線程中創建組件,但只要首先顯示框架,所有對swing組件的訪問必須由swing事件處理線程完成。 – 2010-08-14 17:12:10

+1

@MauricePerry:這曾經是真的,但它已不再(並且很長一段時間)。擺動文件說,組件必須始終在EDT中使用,無論它們是否可見。 – 2012-01-14 12:34:58

0

這是有一個閃屏(帶或不帶進度條 - 它好得多,當然)的goeal。你應該向用戶展示一個不錯的飛濺,然後在EDT線程的主窗口開始初始化所有組件,並在最後顯示你的框架。在EDT之外創建Swing組件可能(它肯定會)至少會在可見性方面造成問題,但也可能會在您的線程和EDT之間併發訪問。 不要這樣做,很難檢測到這些問題,它可能會在不同的硬件上隨機顯示。當然,如果你有一個進度條,你需要一些免費的EDT時間來渲染進度條的變化 - 實際上甚至是刷新啓動畫面本身(如果另一個應用程序阻塞一段時間,重新繪製背景圖片),你需要美國東部時間的空閒時間。

您應該將您的初始化劃分爲更小的塊,運行時間不會超過500毫秒,並使用SwingUtilities.invokeLater將它們安排在EDT上。

1

先顯示空白主框架,然後加載其餘的UI。當應用程序就緒(主框架可見) - Application.ready()方法時,您可以使用Swing應用程序框架(或現在的BSAF)來初始化組件並構建佈局。使用http://code.google.com/p/jbusycomponent/來顯示該應用程序正在加載...