有没有办法以编程方式强制操作系统在Java中切换语言输入?

时间:2014-07-19 04:15:18

标签: java swing locale jtextfield

每个操作系统都有不同的方案来更改键盘或鼠标的语言。 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);
    }
    } );

1 个答案:

答案 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方法来提交或取消先前客户端组件的组合文本。"