Swing I18N:何时加载属性?

时间:2010-07-07 14:06:28

标签: java swing internationalization

我正在重构现有的Java桌面应用程序,以从.properties文件加载国际化的UI文本标签。在应用程序生命周期中是否适合加载属性文件并在内存中填充字符串?现有的实现将每个组件的标签定义为例如:public static final String foo = "bar";在构造函数中加载文本似乎效率低(因为它将在所有实例之间共享),但是在static {...}块中执行所有操作都不会似乎也很安心。这里最好的做法是什么?

4 个答案:

答案 0 :(得分:6)

在我看过的大多数应用程序中,属性是在开始构建主UI之前从文件加载的。这些属性加载到ResourceBundle中,它将是

  • 静态
  • 作为每个构造函数的参数给出

答案 1 :(得分:3)

另一种方法,而不更改面板代码,是使用某种“资源注入”。

以下库执行该操作,其中包括:

  • fuse:就是这样(但我从未测试过,项目现在似乎已经死了)
  • Swing Application Framework:做了很多事情,包括资源注入。也许值得检查一下源代码,找出与您相关的内容。请注意,该项目也已死亡,源代码非常混乱(可能不容易提取相关代码)
  • Guts-GUI:是一个完整的GUI框架,包括资源注入,但它基于Guice。如果您对Guice有所了解,那么资源注入的源代码应该易于理解并从项目中提取。

在大多数情况下,资源注入基于为每个组件提供的名称(这就是Swing App Framework和Guts-GUI的工作方式,对于Fuse我不确定)。 如果组件未正确命名,您还可以选择自动命名它们(不更改面板的源代码)。我已经在Guts-GUI包中实现了这样的方法,你可能也想看看它。

然后通常在显示框架或对话框之前调用资源注入(这将是当前源中唯一需要修改的代码位置,如果打开对话框/框架的代码集中在一个类中而不是四处传播。)

答案 2 :(得分:2)

我建议懒洋洋地加载资源。基本上,创建一个函数来获取你的资源包,如果它还没有加载它。而不是用它来检索你的资源。

答案 3 :(得分:2)

我会选择延迟加载。当您事先加载所有内容时,只会增加应用程序启动时间,甚至可能会加载甚至不需要的东西(更多)。

顺便说一句,你提到的这个静态的东西,无论如何都会最终导致延迟加载,因为JVM会为类加载延迟。另外:当您使用ResourceBundles时,请记住它们执行了一些内部缓存,因此定义了

public static final String labelText= "hello world";

或者更糟糕的是,从资源捆绑中初始化它是毫无意义的。

进一步阅读:

A method for handling I18N in Java