2010-07-07 31 views
4

我正在重構現有的Java桌面應用程序以從.properties文件加載國際化的UI文本標籤。當在應用程序生命週期中是加載屬性文件並在內存中填充字符串的適當時間?現有的實現將每個組件的標籤定義爲例如:public static final String foo = "bar";在構造函數中加載文本看起來效率不高(因爲它將在所有實例之間共享),但在static {...}塊中執行所有操作似乎也不是很理想。這裏最好的做法是什麼?Swing I18N:何時加載屬性?

回答

6

在我看到的大多數應用程序中,在開始構建主UI之前,從文件加載屬性。這些屬性在ResourceBundle加載哪個要麼是

  • 靜態
  • 作爲參數提供給每個構造
2

我會建議加載資源懶洋洋地。基本上,創建一個函數,讓你的資源包加載它,如果它還沒有。比用它來檢索你的資源。

3

另一種方式,不改變面板代碼,是使用某種「資源注入」。

以下庫執行,除其他事項外:

  • fuse:就是這樣做的(但我從來沒有測試,該項目現在似乎已死亡)
  • Swing Application Framework:做了很多的事情,包括資源注射。也許值得在源代碼中檢查一下,以便找出與您相關的內容。請注意,該項目也是死的,源代碼很雜亂(可能不容易提取相關的代碼)
  • Guts-GUI:是一個完整的GUI框架,包括資源注入,但它是基於Guice。如果您對Guice有所瞭解,那麼資源注入的源代碼應該易於理解並從項目中提取。

在大多數情況下,資源注入是基於給每個組件的(這是怎樣的Swing應用程序框架和膽量的圖形用戶界面的工作,保險絲我不知道)。 如果組件命名不正確,您還可以選擇自動命名它們(不更改面板的源代碼)。我已經在Guts-GUI包中實現了這種方法,您可能也想看看它。

然後通常在顯示框架或對話框之前調用資源注入(這將是唯一的代碼位置,必須在當前源代碼中進行修改,如果用於打開對話框/框架的代碼已集中在一個類中,沒有四處散佈)。

2

我會選擇延遲加載。事先加載所有內容時,只需增加應用程序啓動時間,甚至有可能加載甚至不需要的東西(不再需要)。

順便說一下,你提到的這個靜態事件會最終導致延遲加載,因爲JVM會爲類進行延遲加載。另外:當您使用把ResourceBundle,請記住,他們做一些內部緩存,所以定義

public static final String labelText= "hello world"; 

,或者更糟糕,從資源初始化它是毫無意義。

進一步閱讀:

A method for handling I18N in Java