每个操作系统都有不同的方案来更改键盘或鼠标的语言。 Java中是否有任何API支持以编程方式更改语言?
我想要的是一个带有两个JTextField对象的翻译器。如果我输入一个,我会自动输入英文,如果我输入另一个,我想自动切换到另一种语言。如果该语言是日语或中文,我希望操作系统在进入该组件时自动切换到该语言,而无需每次都手动切换。下面是一些使用Locale和InputContext的示例代码。它表明它成功设置了上下文,但我输入并且英语出来了。与我手动切换到日语相比,键入将导致日语字符。我做错了什么?
public class TestLocale extends JFrame {
public TestLocale() {
super("TestLocale");
setSize(600,600);
JTextField a = new JTextField("English");
JTextField b = new JTextField("Japanese");
Locale loc =Locale.JAPANESE;
System.out.println("Script: " + loc.getScript());
System.out.println("Language: " + loc.getLanguage());
b.setLocale(loc);
b.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
InputContext c = InputContext.getInstance();
boolean b = c.selectInputMethod(Locale.JAPANESE);
System.out.println("Trying to request Japanese: " + b);
}
} );
add(BorderLayout.NORTH, a);
add(BorderLayout.SOUTH, b);
setVisible(true);
}
public static void main(String[] a) {
TestLocale t = new TestLocale();
}
}
由于日语是多字节和更复杂的,我试过希腊语。我可以在这里切换到希腊语:ασδκφξησκ (手动地)
但是当我选择希腊语输入上下文时,没有任何反应:
b.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
InputContext c = InputContext.getInstance();
boolean b = c.selectInputMethod(new Locale("el", "GR"));
System.out.println("Trying to request Greek: " + b);
}
} );
答案 0 :(得分:8)
Java中是否有任何API支持以编程方式更改语言?
不适用于操作系统...
实际上,在Unix / Linux系统中,语言环境设置由环境变量控制,这样的API将无法实现。 Unix / Linux程序无法更改其父shell的环境变量。甚至找到" rc"系统/用户/应用程序放置区域设置变量设置的文件是不切实际的。
您可能希望获得的最佳功能是一系列特定于操作系统的命令,这些命令将更改操作系统的默认区域设置,或与窗口管理器进行交互。请记住,默认语言环境设置(在许多操作系统上)的更改只会在用户的shell重新启动时传播,等等。
另一方面,Java程序可以控制它自己使用的输入方法将键盘事件转换为字符。例如,请参阅InputContext.selectInputMethod
。
java.awt.im
package summary javadoc中有更多文档。
我的问题专门询问我是否可以切换一个JTextField的输入法。 ... InputContext似乎没有这样做......
框架文档(参见javadoc链接)说明了这一点:
" 默认情况下,每个Window实例创建一个InputContext实例,并且此输入上下文由窗口的包含层次结构中的所有组件共享。 如有必要,组件可以创建私有输入上下文。没有自己的输入上下文的组件使用其父级使用的组件。输入上下文最多具有一个当前客户端组件,即当前具有焦点的组件。切换到新的客户端组件时,输入上下文调用其endComposition方法来提交或取消先前客户端组件的组合文本。"