我正在重構現有的Java桌面應用程序以從.properties文件加載國際化的UI文本標籤。當在應用程序生命週期中是加載屬性文件並在內存中填充字符串的適當時間?現有的實現將每個組件的標籤定義爲例如:public static final String foo = "bar";
在構造函數中加載文本看起來效率不高(因爲它將在所有實例之間共享),但在static {...}
塊中執行所有操作似乎也不是很理想。這裏最好的做法是什麼?Swing I18N:何時加載屬性?
4
A
回答
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";
,或者更糟糕,從資源初始化它是毫無意義。
進一步閱讀:
相關問題
- 1. 如何使用jQuery.i18n.properties.js + Spring 3加載i18n屬性文件mvc
- 2. 如何在spring中加載javascript i18n屬性文件?
- 3. i18n asp.net mvc4屬性?
- 4. i18n屬性後退
- 5. Mongoid加載ActiveModel + +驗證的I18n,不能正常轉換屬性
- 6. 加載log4j屬性
- 7. 導航屬性何時加載?
- 8. i18n在CSS屬性「內容」
- 9. 爲i18n設計屬性?
- 10. Java Swing屬性(addPropertyChangeListener)
- 11. 如何覆蓋繼承屬性的i18n?
- 12. 延遲加載tableview時更改屬性?
- 13. 加載屬性文件時出錯
- 14. Magento - 加載產品時屬性不好?
- 15. Java Swing屬性編輯器
- 16. Java Swing UI屬性列表?
- 17. scala swing元素的屬性
- 18. 加載屬性延遲加載
- 19. 如何覆蓋屬性從文件加載屬性從數據庫加載ServletContextPropertyPlaceholderConfigurer?
- 20. 如何使用jquery添加加載時間屬性
- 21. spring i18n:多屬性文件的問題
- 22. grails i18n不更改代碼屬性
- 23. 沒有屬性文件的Java EE i18n
- 24. 縫i18n屬性文件從外部罐
- 25. 如何打包並在運行時加載i18n模塊?
- 26. 加載屬性文件
- 27. 加載跟蹤器屬性
- 28. Webservice - 加載屬性文件
- 29. DropDownList加載選項屬性
- 30. 延遲加載屬性