【问题标题】:Swing I18N: When to load properties?Swing I18N:何时加载属性?
【发布时间】:2010-07-07 14:06:28
【问题描述】:
我正在重构现有的 Java 桌面应用程序以从 .properties 文件加载国际化的 UI 文本标签。在应用程序生命周期中,何时是加载属性文件并将字符串填充到内存中的合适时间?现有的实现将每个组件的标签定义为例如:public static final String foo = "bar"; 在构造函数中加载文本似乎效率低下(因为它将在所有实例之间共享),但是在 static {...} 块中执行所有操作似乎并不理智任何一个。这里的最佳做法是什么?
【问题讨论】:
标签:
java
swing
internationalization
【解决方案2】:
另外一种不改变面板代码的方法是使用某种“资源注入”。
除其他外,以下库执行此操作:
-
fuse: 就是这样做的(但我从来没有测试过,现在这个项目似乎已经死了)
-
Swing Application Framework:做了很多事情,包括资源注入。也许值得检查源代码以找出与您相关的内容。注意项目也死了,源码比较乱(可能不好提取相关代码)
-
Guts-GUI:是一个完整的GUI框架,包括资源注入,但它是基于Guice的。如果你对 Guice 有一点了解,那么资源注入的源代码应该很容易理解,并且可以从项目中提取出来。
在大多数情况下,资源注入基于赋予每个组件的名称(这就是 Swing App Framework 和 Guts-GUI 的工作方式,对于 Fuse 我不确定)。
如果组件没有正确命名,您还可以选择自动命名它们(无需更改面板的源代码)。我已经在 Guts-GUI 包中实现了这样的方法,您可能还想看看它。
然后通常在显示您的框架或对话框之前调用资源注入(这将是您当前源代码中唯一需要修改的代码位置,如果用于打开对话框/框架的代码已集中在一个类中而不是散布在各处)。
【解决方案3】:
我建议懒惰地加载资源。基本上,创建一个函数来获取您的资源包,如果它还没有加载它。而不是用它来检索你的资源。
【解决方案4】:
我会选择延迟加载。当您预先加载所有内容时,您只会增加应用程序的启动时间,甚至可能会冒险加载甚至不需要(不再需要)的内容。
顺便说一句,你提到的这个静态的东西,无论如何都会有效地以延迟加载结束,因为 JVM 对类进行延迟加载。另外:当你使用 ResourceBundles 时,记住它们会做一些内部缓存,所以定义一个
public static final String labelText= "hello world";
或者,更糟糕的是,从资源包中初始化它是毫无意义的。
进一步阅读:
A method for handling I18N in Java