时间:2010-07-23 19:38:16

标签: java swing internationalization desktop locale

5 个答案:

答案 0 :(得分:3)

据我所知,有些应用程序使用布局/组件构建器(由Karsten Lentzsch建议,以及JGoodies API的一部分)。这些构建器包括用于本地化组件的代码(使用引擎盖下的ResourceBundle)。

其他人(包括我在内)更喜欢资源注入;这通常是侵入性最小的方法。这是Swing Application Framework(JSR-296)和其他GUI框架(如Guts-GUI)选择的方式。

您可能还想查看与您的this question非常相似的Guts-GUI source code

关于“动态”语言的更改(Locale更改通知),我认为在使用资源注入时更容易实现(我已经在Guts-GUI中实现了这一点,Swing Application Framework也可能有它,但我不确定)。

Java无法监听Locale更改,因此您必须创建自己的“区域设置服务”(应将任何区域设置更改请求发送到该服务)。在此服务中,您必须枚举所有可见窗口(这可以使用Window.getWindows(),无需在之前注册可见组件)然后再次注入资源。

如果您想要一个示例,请查看ResourceInjector中的resource包:

  • WindowController显示了资源注入和更改Locale的方法,它会发送通知事件(使用事件总线,但简单的侦听器也可以)这个改变
  • {{3}}侦听区域设置更改事件

更新所有可见窗口的有趣代码将在以下复制:

for (Window window: Window.getWindows())
{
    if (window.isVisible())
    {
        injectResources(window);
        window.repaint();
        if (window instanceof RootPaneContainer)
        {
            ((RootPaneContainer) window).getRootPane().revalidate();
        }
    }
}

答案 1 :(得分:1)

答案 2 :(得分:1)

Java 6 SE允许您即时重新加载资源包。 只需调用clearCache()类的ResourceBundle静态函数即可。 然后再次致电getBundle ()

请参阅缓存控件

下的this article

答案 3 :(得分:1)

我想出的唯一解决方案是创建一个需要重新渲染的所有组件的大量注册表。然后,如果调用切换Locale,您只需调用注册表,它将遍历所有已注册的组件并调整其值。因此,例如对于所有已注册的JLabel,它将按照

的顺序执行某些操作
for(JLabel specificJLabel : REGISTRY.registeredJLabels)
{
  String localeKey = specificJLabel.getActionCommand();
  specificJLabel.setText(ResourceBundle.getString(localeKey)); 
}

其中Locale键存储在组件ActionCommand中。然后,无论当前呈现什么屏幕,主父面板都负责重新呈现它。此外,注册表不必管理区域设置密钥,这些密钥与注册表完全分离。每个组件都负责管理它自己的ResourceBundle的Locale Keys。

答案 4 :(得分:0)