Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法通过编程强制操作系统在Java中切换语言输入?_Java_Swing_Locale_Jtextfield - Fatal编程技术网

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

有没有办法通过编程强制操作系统在Java中切换语言输入?,java,swing,locale,jtextfield,Java,Swing,Locale,Jtextfield,每个操作系统都有一个不同的从键盘或鼠标更改语言的方案。Java中是否有支持以编程方式更改语言的API 我想要的是一个具有两个JTextField对象的翻译器。如果我输入一种,我会自动用英语输入,如果我输入另一种,我会自动切换到另一种语言。如果该语言是日语或汉语,我希望操作系统在进入该组件时自动切换到该语言,而无需每次手动切换。下面是一些使用Locale和InputContext的示例代码。这表明它成功地设置了上下文,但我输入了,英语就出来了。这与我手动切换到日语形成对比,在日语中键入将产生日语字

每个操作系统都有一个不同的从键盘或鼠标更改语言的方案。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);
    }
    } );
Java中是否有支持以编程方式更改语言的API

不适用于操作系统

事实上,在Unix/Linux系统上,语言环境设置由环境变量控制,这样的API是不可能实现的。Unix/Linux程序无法更改其父shell的环境变量。即使在系统/用户/应用程序已放置区域设置变量设置的“rc”文件中也不太实际

最好的方法是使用一组特定于操作系统的命令来更改操作系统的默认区域设置,或者与窗口管理器交互。请记住,默认语言环境设置的更改(在许多操作系统上)只会在用户的shell重新启动时传播,等等


另一方面,Java程序可以控制自己用来将键盘事件转换为字符的输入法。例如,请参见

中有更多文档



我的问题特别问我是否可以为一个JTextField切换输入法。。。InputContext似乎没有执行此操作

框架文档(请参见javadoc链接)说明:

默认情况下,每个窗口实例创建一个InputContext实例,该输入上下文由窗口包含层次结构中的所有组件共享如有必要,组件可以创建专用输入上下文。没有自己输入上下文的组件使用其父组件使用的输入上下文。输入上下文最多有一个当前客户端组件,即当前具有焦点的组件。切换到新的客户端组件时,输入上下文调用其endComposition方法来提交或取消上一个客户端组件的合成文本。”

Java中是否有支持以编程方式更改语言的API

不适用于操作系统

事实上,在Unix/Linux系统上,语言环境设置由环境变量控制,这样的API是不可能实现的。Unix/Linux程序无法更改其父shell的环境变量。即使找到“rc”“系统/用户/应用程序放置区域设置变量设置的文件是不切实际的

最好的方法是使用一组特定于操作系统的命令来更改操作系统的默认区域设置,或者与窗口管理器交互。请记住,默认语言环境设置的更改(在许多操作系统上)只会在用户的shell重新启动时传播,等等


另一方面,Java程序可以控制自己用来将键盘事件转换为字符的输入法。例如,请参见

中有更多文档



我的问题特别问我是否可以为一个JTextField切换输入法。。。InputContext似乎没有执行此操作

框架文档(请参见javadoc链接)说明:

默认情况下,每个窗口实例创建一个InputContext实例,该输入上下文由窗口包含层次结构中的所有组件共享如有必要,组件可以创建专用输入上下文。没有自己输入上下文的组件使用其父组件使用的输入上下文。输入上下文最多有一个当前客户端组件,即当前具有焦点的组件。切换到新的客户端组件时,输入上下文调用其endComposition方法来提交或取消上一个客户端组件的合成文本。”


您应该查看区域设置。我创建了两个JTextField,并将其中一个的区域设置为英语,另一个的区域设置为日语。当我单击textfield时,它不会默认为以日语键入。您应该查看区域设置。我创建了两个JTextField,并将其中一个的区域设置为英语,另一个的区域设置为日语。它不会当我点击textfield时,默认输入日语。我的问题特别是问我是否可以为一个JTextField切换输入法。为了更清楚,我添加了代码。InputContext似乎没有这样做,不确定我做错了什么。如果你看一下我的代码,我请求更改输入c当你输入该字段时,我可以将其改回英文,但它不起作用我不是
java.awt.im
方面的专家。我只知道如何搜索和阅读文档。(提示!!)我的问题特别问我是否可以为一个JTextField切换输入法。为了更清楚,我添加了代码。InputContext似乎没有这样做,不确定我做错了什么。如果你看一下我的代码,当你输入该字段时,我请求更改输入上下文。好的,我是c