我尝试在swing应用程序中运行时更改Locale.
但我无法弄清楚它应该如何运作,或者没有总体规划?
我只能想到两个选择:
1.重新启动应用程序,而不是最好的用户体验.
2.创建一个可以注册/取消注册组件的本地化管理器,在更改时它只是迭代所有组件并更改文本.
1和2都感觉很尴尬.
其他信息:
目前,方向不是目标.
该应用程序是混淆的.
例:
LocRes_en.properties:
text1 = English text
LocRes_ja.properties
text1 = Japanese text
ChangeLocale.java:
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class ChangeLocale {
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ChangeLocale window = new ChangeLocale();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public ChangeLocale() { … 我一直遵循Google的Window Builder Pro扩展指南,以使我的应用程序国际化。现在,将在标签中显示的字符串存储在由“外部字符串”向导创建的属性文件中(我使用了经典的日食消息文件)。
在我的initialize方法内部,所有标签都被初始化,其文本设置如下:
JLabel lblLanguage = new JLabel(Messages.getString("App.lblLanguage.text")); //$NON-NLS-1$
Run Code Online (Sandbox Code Playgroud)
我在类中创建了一个App包含GUI 的枚举类型:
private enum Lang { German(Locale.GERMAN), English(Locale.ENGLISH);
private Locale loc;
Lang (Locale l) {
loc = l;
}
Locale getLocale() {
return loc;
}
}
Run Code Online (Sandbox Code Playgroud)
将使用组合框设置语言,该组合框使用枚举类型Lang来显示可用的语言:
JComboBox cboLanguage = new JComboBox();
cboLanguage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource();
Lang l = (Lang)cb.getSelectedItem();
// TODO: update language
}
});
cboLanguage.setModel(new DefaultComboBoxModel(Lang.values()));
Run Code Online (Sandbox Code Playgroud)
我发现了许多其他的howto和教程,它们涵盖了swing应用程序的国际化,但是它们都没有涉及如何更新所有标签(以及可能包含文本的其他控件)。SO上有这个答案,如果链接没有死的话,可能会有所帮助。
因为我是Java GUI编程的新手,所以我现在真的不知道该做什么,这是我的问题:
updateLanguage …