我想在运行时更改SWT应用程序的语言。怎么做?

时间:2011-05-19 01:18:13

标签: java swing internationalization

我正在为我的软件工程类开发一个应用程序,其中一个要求是它在界面中有两种或更多语言。我已经实现了。另一方面,要求用户可以通过从组合框或类似的东西中选择来改变语言。

由于我使用的是AWT和Netbeans,因此我无法编辑表单的initComponents方法,因为它是自动生成的。我有下面的选项,但不知道他们是否会工作,所以我在寻求帮助。

-Edit我的类的构造函数,使它看起来像这样:

public JFmyConstructor() {
    initComponents(); //auto-generated
    myInitMethod();
}

我认为我将要找到的问题是,我需要在接口运行后调用构造函数一次(因此,所有对象都已实例化。是否有解决方法?

3 个答案:

答案 0 :(得分:1)

可能我的答案有点晚了(你输错了标题太糟糕了)......

显然,您不必调用任何构造函数来在运行时切换语言。在Java桌面应用程序中,它非常简单:

Locale brazilian = new Locale("pt", "BR");
Locale.setDefault(brazilian);

当然,如果你想通过JComboBox进行切换,你可能会做的有点不同。我会做什么,我实际上会创建Model(Swing提升MVC设计模式)来保存数据(不同的Locales),我会在正确的ActionListener中设置默认的Locale。但这并不容易。

当然我宁愿使用Locales的原生名称。如果你构造了它们,只需调用getDisplayName()将自身作为参数传递,就可以轻松获得本机名称Locale名称:

String brazilianNativeName = brazilian.getDisplayName(brazilian);

某些Locales的结果可能不令人满意(我相信巴西葡萄牙语不幸的是其中之一),但是你可以做的很多(除非你使用自己的字符串)。

老实说,对于两种语言,我可能会使用一些链接。您可以使用简单的JLabel来做到这一点,只需设置正确的字体属性和颜色,并指定常用的ActionListener。然后,您可以查询实际单击了哪一个,并相应地创建和设置Locale。对于应该足够的家庭作业。

答案 1 :(得分:0)

SWT和NetBeans是一个奇怪的组合。如果您可以使用SWT以“正常”方式执行操作并使用Eclipse,则可以使用一组强大的工具来管理本地化,所有工具都内置于其中。例如,请参阅this introduction.

答案 2 :(得分:0)

最好的方法是对所有组件使用资源注入(而不是在面板构建时从Bundle获取i18n字符串)。

资源注入可在许多开源库或框架中使用。

由于您使用NetBeans,因此您应该能够基于 Swing Application Framework (SAF)生成应用程序,该应用程序已经支持资源注入。

否则,还有一些库可以做到这一点;只需谷歌搜索“swing”“资源注入”,您就会发现,例如 Fuse 库。

编辑: 您还应该看一下this SO question完全处理相同问题的问题,以及更详细的答案(包括我自己的答案)。