2009-03-05 43 views
19

我希望能够在运行时更改我的Swing应用程序中的语言环境,并使屏幕上的所有文本元素都使用新语言环境的ResourceBundle中的本地化文本进行更新。在Swing中运行时更改语言环境

这可以在没有自定义摆动组件或为处理呈现本地化文本的所有组件创建UIDelegates的情况下完成吗?

如果不是,那么我可以考虑实施什么样的解决方案?

+0

respondend here:http:// stackoverflow。com/questions/14810454/swing-internationalization-how-to-update-language-at-runtime/30960413#30960413 – Heitor 2015-06-21 13:31:59

回答

12
  1. 您有一种方法用于更改应用程序语言环境(可能会持久存储新值),另一种方法用于获取本地化字符串。

  2. 创建一个接口:

    interface LocaleChangeListener { 
        void onLocaleChange(); 
    } 
    

    由需要能够在运行时改变区域和覆盖onLocaleChange()设置新值UI组件实现它。

  3. 现在,有一个侦听器列表,它将通过第一种方法通知语言环境更改。

+0

我们决定做一些与此非常相似的事情。除了我们要使用一些系统属性和反射来尝试刷新事件发生时屏幕上的所有组件。最高层的Jpanel将会听取当地的变化。 – 2009-10-12 18:32:22

-1

还有我看到两个明显的方法:

而不是从ResourceBundle得到一个String的,获得某种事件源String持有人。 Document将是非常繁重的解决方案,但任何可以处理替换不可变值的东西都可以。不要只是在标签上设置文本,比如说,有一种方法可以设置一个监听器。请注意,这是一个相当“重”的解决方案。

或者,让一个中央仓库的侦听器在一个语言环境变化中被触发,然后每个语句返回并重新执行设置代码的相关部分(不重复)。对于常见的情况,例如,您可以使用字面上的资源字符串JLabel,那么可以将这些全部组合成一个具有WeakHashMap<JLabel,String>的侦听器。有时候它会更好地避免大量的小听众。

2

您可能想要保存语言首选项,然后要求重新启动应用程序才能使更改生效。

然后,在渲染GUI之前,您应该能够在启动时使用Locale.setDefault(Locale.<desired language>);。这应该正确地切换您的语言环境,这将导致加载所需的.properties文件。

+0

这就是我们要做的事情,如果我们不能拿出适合时间表的东西。谢谢 – 2009-03-05 18:59:22

+0

OP在运行时需要一些东西。重新启动不是一个选项。 – FaithReaper 2016-08-09 10:44:32

16

使用ResourceBundle.getBundle(BUNDLE_NAME).getString(key);来访问字符串。

当更新默认语言环境例如通过Locale.setDefault(Locale.GERMAN); 明确资源包缓存:ResourceBundle.clearCache();

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);下一次调用应该返回所选择的语言环境的本地化String。

0

怎么样,在改变语言环境时,做一个firePropertyChangeEvent(“locale”,“...”),然后添加propertyChangeListener()并注册它们,无论标签等都要更新?