Java 为什么设置JDialog或JFrame setVisible(true)会切换我的IME设置?
我发现,当我在Java swing应用程序中显示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
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记住每个正在运行的应用程序的键盘/语言集有关:
这也适用于JVM应用程序,例如Eclipse,因此我认为这不是JVM语言环境问题。首先,OP的代码中有一个bug。让我键入正确的内容:
l = new Locale("zh", "TW");
OP的意思是半宽/全宽(不是半字节/全字节)。在全宽模式下,英文字母将使用多个字节,例如A 而不是A。这可以使用移位空间进行切换
输入法简介
在“区域和语言”中,您可以选择一种语言以及许多键盘。例如,简体中文至少有三种常用键盘:
l = new Locale("zh", "TW");