gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:02:05 24 4
gpt4 key购买 nike

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

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

有谁知道代码有什么问题,或者是Java的错误?

重现问题的过程:

  1. 运行应用程序。
  2. 将您的语言更改为中文输入法之一,例如。中文(繁体) - 快速
  3. 点击程序中的按钮

我的语言设置

enter image description here

我发现了一个类似的问题 Automatic toggling of character width by Windows 7 input methods in Java

添加默认语言环境后,它仍然无法正常工作

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();
}
}
});
}


}

最佳答案

根据Oracle documentation ,从我对问题的理解来看,这似乎与我预期的一样:

The default locale of your application is determined in three ways. First, unless you have explicitly changed the default, the Locale.getDefault() method returns the locale that was initially determined by the Java Virtual Machine (JVM) when it first loaded. That is, the JVM determines the default locale from the host environment. The host environment's locale is determined by the host operating system and the user preferences established on that system.

在您的问题中,Windows 中的默认设置在 应用程序启动之后发生了更改,这意味着 JVM 区域设置已经设置。特定框架的语言环境已设置,但新框架的创建会根据默认语言环境设置语言环境(JDialog 和 JFrame 都会发生这种情况):

 protected void dialogInit() {
enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
setLocale( JComponent.getDefaultLocale() );
setRootPane(createRootPane());
setRootPaneCheckingEnabled(true);
if (JDialog.isDefaultLookAndFeelDecorated()) {
boolean supportsWindowDecorations =
UIManager.getLookAndFeel().getSupportsWindowDecorations();
if (supportsWindowDecorations) {
setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
}
}
sun.awt.SunToolkit.checkAndSetPolicy(this, true);
}

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

javax.swing.JComponent.setDefaultLocale(locale);

这设置了 VM 的默认语言环境(它实际上调用到

SwingUtilities.appContextPut(defaultLocale, l);

这使得正在发生的事情变得更加明显)。

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


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

Provides methods to control text input facilities such as input methods and keyboard layouts. Two methods handle both input methods and keyboard layouts: selectInputMethod lets a client component select an input method or keyboard layout by locale, getLocale lets a client component obtain the locale of the current input method or keyboard layout.

关于java - 为什么设置 JDialog 或 JFrame setVisible(true) 会切换我的 IME 设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24489808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com