Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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 为什么设置JDialog或JFrame setVisible(true)会切换我的IME设置?_Java_Swing_Jdialog_Ime - Fatal编程技术网

Java 为什么设置JDialog或JFrame setVisible(true)会切换我的IME设置?

Java 为什么设置JDialog或JFrame setVisible(true)会切换我的IME设置?,java,swing,jdialog,ime,Java,Swing,Jdialog,Ime,我发现,当我在Java swing应用程序中显示JDialog或新的JFrame时,我的中文输入法将在Windows 7中从半字节模式切换到全字节模式 为什么调用对话框或框架setVisible(true)方法会切换我的IME设置 有人知道代码出了什么问题吗,或者这是Java的一个bug 重现问题的步骤: 运行应用程序 将您的语言更改为中文输入法之一,例如中文(繁体)-快速 单击程序中的按钮 我的语言环境 我发现了一个类似的问题 在添加默认区域设置后,它仍然不起作用 import java.a

我发现,当我在Java swing应用程序中显示
JDialog
或新的
JFrame
时,我的中文输入法将在Windows 7中从半字节模式切换到全字节模式

为什么调用对话框或框架
setVisible(true)
方法会切换我的IME设置

有人知道代码出了什么问题吗,或者这是Java的一个bug

重现问题的步骤:

  • 运行应用程序
  • 将您的语言更改为中文输入法之一,例如中文(繁体)-快速
  • 单击程序中的按钮
  • 我的语言环境

    我发现了一个类似的问题

    在添加默认区域设置后,它仍然不起作用

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import java.awt.BorderLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.util.Locale;
    
    public class MainWindow {
    
    private JFrame frame;
    private Locale l;
    
    /**
     * Create the application.
     */
    public MainWindow() {
        initialize();
    }
    
    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
    
        l = new Locale("zh", "zh_TW");
    
        frame = new JFrame();
        frame.setLocale(l);
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
    
                JDialog d = new JDialog(frame, "Run", true);
                d.getContentPane().add(new JLabel("dsad"));
                d.setMinimumSize(new Dimension(150, 100));
                d.setLocationRelativeTo(null);
                d.setLocale(l);
                d.setVisible(true);
    
            }
        });
        frame.getContentPane().add(btnNewButton, BorderLayout.CENTER);
    }
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainWindow window = new MainWindow();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    
    }
    
    我做了一个简单的测试:

    我打开IE,选择了一个标签,在地址栏上,将中文输入法设置为半宽。然后单击另一个选项卡,IME将自动更改为全宽

    所以我认为这与Java没有任何关系。这是Windows/IME的行为。

    根据,从我对问题的理解来看,这似乎是我所期望的:

    应用程序的默认区域设置由三种方式确定。首先,除非您显式更改了默认值,否则Locale.getDefault()方法将返回Java虚拟机(JVM)首次加载时最初确定的区域设置。也就是说,JVM根据主机环境确定默认语言环境。主机环境的区域设置由主机操作系统和在该系统上建立的用户首选项决定

    在您的问题中,应用程序启动后,Windows中的默认设置已更改,这意味着JVM区域设置已设置。设置了特定框架的区域设置,但创建新框架时会根据默认区域设置设置区域设置(对于JDialog和JFrame都是这样):

    由于您正在Windows中设置默认区域设置,因此可能会认为JComponent.getDefaultLocale()将返回Windows区域设置。getDefaultLocale()本身返回当前应用程序上下文的区域设置(VM区域设置)。调用以下方法将为当前上下文设置区域设置:

    javax.swing.JComponent.setDefaultLocale(locale);
    
    设置VM的默认区域设置(它实际上调用

    SwingUtilities.appContextPut(defaultLocale, l);
    
    这使得发生的事情更加明显)

    如果设置defaultLocale解决了这个问题,我可以想象,在调用链的其他地方,defaultLocale被调用的方式会导致Windows更改设置


    如果这不能提供预期的功能,那么我认为建议您研究的唯一其他属性是类:

    提供控制文本输入工具(如输入法和键盘布局)的方法。有两种方法同时处理输入法和键盘布局:selectInputMethod允许客户端组件按区域设置选择输入法或键盘布局,getLocale允许客户端组件获取当前输入法或键盘布局的区域设置


    我认为这可能与Windows 7记住每个正在运行的应用程序的键盘/语言集有关:

  • 我打开浏览器(在本例中为Chrome)。我可以在任务栏上看到我的键盘设置是ES(西班牙语)
  • 然后我打开任何其他应用程序。没有什么变化
  • 我再次在浏览器中设置焦点
  • 我按Alt+Shift,这是更改键盘设置的快捷键。现在我看到的是英语
  • 我单击其他应用程序的窗口(或使用Alt+TAB)。我的键盘设置更改为ES
  • 每次我回到浏览器时,键盘设置都会变为EN,为其他应用程序保留ES

  • 这也适用于JVM应用程序,例如Eclipse,因此我认为这不是JVM语言环境问题。

    首先,OP的代码中有一个bug。让我键入正确的内容:

    l = new Locale("zh", "TW");
    
    OP的意思是半宽/全宽(不是半字节/全字节)。在全宽模式下,英文字母将使用多个字节,例如A 而不是A。这可以使用移位空间进行切换

    输入法简介 在“区域和语言”中,您可以选择一种语言以及许多键盘。例如,简体中文至少有三种常用键盘:

  • 美国键盘允许用户输入英语,无法输入中文

  • Microsoft拼音键盘允许用户键入拼写并选择正确的字符

  • “双品”允许用户以较少的笔划键入拼写

  • windows7中有更多的键盘只用于简体中文

  • 这够复杂吗?我还有更多要告诉你的:在一个键盘下,比如微软拼音,有一些模式,允许你在键入中文时选择一个Unicode符号或一个ASCII符号作为逗号、句点和其他标点。是的,我可以先用、、打一段时间的中文单词,然后我可以切换模式,然后我可以用、、打中文

    什么?我正在用中文输入法输入英语?是的,除了中文输入法中的美国键盘外,微软的拼音键盘也有输入英文的模式。所以如果我想输入英语,我可以使用美国英语

    ,或中文美国键盘

    ,或具有英文模式的中文Microsoft拼音键盘

    我的回答 OP明确想要的是切换键盘,甚至是一个键盘下的模式,而不是切换语言。在Java中,可以通过多种方式设置语言环境来更改语言,但不能更改键盘,也不能更改模式。如果我想让我的Java Swing应用程序切换到带有中文双键盘的模式,用于中文输入,但带有英文标点符号,该怎么办

    如果我错了,请纠正我,但是Java没有办法为特定IME选择本机键盘,或者m
    l = new Locale("zh", "TW");