使用 InputContext.selectInputMethod 指定键盘布局总是失败

using InputContext.selectInputMethod to specify a keyboard layout always fails

我正在 java 中编写 English/Arabic 字典。我希望应用程序根据搜索语言自动将键盘设置为适当的布局。我这样保存键盘语言环境信息:

    JTextField tf = (JTextField) e.getSource();
    InputContext ic = tf.getInputContext();
    Pref.setInputLocale (Pref.getSearchIndex(), ic.getLocale().toString());

然后像这样恢复它:

    JTextField tf = Ui.makeTextField (20, "", searchListener);
    controlPanel.add(tf);
    String ls = Pref.getInputLocale(Pref.getSearchIndex());
    if (ls.length() > 0) {
        Locale l = new Locale (ls);
        InputContext ic = tf.getInputContext();
        System.out.println (ic.toString());
        System.out.println (l.toString());
        System.out.println (ic.selectInputMethod (l));
    }

输入语言的三个连续切换的系统输出如下所示:

sun.awt.im.InputMethodContext@38e3c8d0
en_us
false
sun.awt.im.InputMethodContext@38e3c8d0
ar_eg
false
sun.awt.im.InputMethodContext@38e3c8d0
en_us
false

系统输出显示语言环境字符串正在成功保存和恢复,但是InputContext.selectInputMethod总是returns错误,并且键盘没有切换到阿拉伯语。有什么建议吗?

问题的出现是因为 ic.getLocale.toString() 产生 "en_us" 但 Locale () 想要 "en","US"。

解决方法是替换这段代码

        Locale l = new Locale (ls);

使用此代码:

        ls = ls.replace("_", "-");
        Locale l =  new Locale.Builder().setLanguageTag(ls).build();

这首先将下划线变成减号,然后使用 setLanguageTag 允许国家/地区使用小写字母。