【问题标题】:Is there a way to programmatically force the OS to switch language inputs in Java?有没有办法以编程方式强制操作系统在 Java 中切换语言输入?
【发布时间】:2014-07-20 09:24:25
【问题描述】:

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

【问题讨论】:

  • 您应该查看语言环境。
  • 我创建了两个 JTextField 并将一个的区域设置为英语,另一个的区域设置为日语。当我点击文本字段时,它不会默认输入日语。

标签: java swing locale jtextfield


【解决方案1】:

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

【讨论】:

  • 我的问题专门问我是否可以为一个JTextField切换输入法。为了更清楚,我附加了代码。 InputContext 似乎没有这样做,不确定我做错了什么。
  • 如果您看一下我的代码,我要求您在输入字段时更改输入上下文。好的,当我转到另一个时,我可以将它改回英文,但它不起作用
  • 我不是java.awt.im 的专家。我只知道如何搜索和阅读文档。 (提示!!)
猜你喜欢
  • 2021-09-09
  • 2019-08-03
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
相关资源
最近更新 更多