Swing I18N:何时加载属性?

问题描述:

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

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

  • 静态
  • 作为参数提供给每个构造

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

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

以下库执行,除其他事项外:

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

在大多数情况下,资源注入是基于给每个组件的(这是怎样的Swing应用程序框架和胆量的图形用户界面的工作,保险丝我不知道)。 如果组件命名不正确,您还可以选择自动命名它们(不更改面板的源代码)。我已经在Guts-GUI包中实现了这种方法,您可能也想看看它。

然后通常在显示框架或对话框之前调用资源注入(这将是唯一的代码位置,必须在当前源代码中进行修改,如果用于打开对话框/框架的代码已集中在一个类中,没有四处散布)。

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

顺便说一下,你提到的这个静态事件会最终导致延迟加载,因为JVM会为类进行延迟加载。另外:当您使用把ResourceBundle,请记住,他们做一些内部缓存,所以定义

public static final String labelText= "hello world"; 

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

进一步阅读:

A method for handling I18N in Java