【问题标题】:Why does setting JDialog or JFrame setVisible(true) toggle my IME setting?为什么设置 JDialog 或 JFrame setVisible(true) 会切换我的 IME 设置?
【发布时间】:2014-08-20 19:20:29
【问题描述】:

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

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

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

重现问题的过程:

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

我的语言设置

我发现了一个类似的问题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();
            }
        }
    });
}


}

【问题讨论】:

  • @Andrew Thompson 我们大多数人,默认情况下是 IDE 的囚徒(有一些增强功能:-),包括。这个
  • @mKorbel 哦,来吧。您的 IDE 不允许您定义自己的模板吗?如果没有,那就买一个更好的。 ;)
  • @AndrewThompson 我已经向java报告了,但是已经快2周了,没有回复,你能推荐一些关键字让我搜索数据库吗?
  • 我首先要搜索的词是“Swing IME”或“Swing 输入法验证”,可能会添加或替换“Locale”(任一词)。
  • 顺便说一句-我从Control Panel找到了我的路| Clock, Language and Region |到Region and Language 对话框。但它看起来与上面显示的不同。如何在 Windows 7 上获得该对话框?

标签: java swing jdialog ime


【解决方案1】:

首先,OP 的代码中有一个错误。让我输入正确的:

l = new Locale("zh", "TW");

OP 的意思是半宽/全宽(不是半字节/全字节)。在全角模式下,一个英文字母会使用一个以上的字节,比如用 A 代替 A。可以使用 Shift-Space 切换。

IME 简介

在区域和语言中,您可以选择一种语言,以及许多键盘。以简体中文为例,至少有三个常用键盘:

  1. 美式键盘允许用户输入英文,无法输入中文

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

  3. 双拼让用户可以用更少的按键输入拼写

  4. Window 7 中添加了更多键盘,仅用于简体中文。

够复杂吗?我还有更多要告诉你的:在微软拼音等键盘中,有一些模式可以让你在输入中文的同时为逗号、句点和其他标点选择 Unicode 符号或 ASCII 符号。是的,我可以先用.,、打一会,然后可以切换模式,然后我就可以用.,\

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

,或中文美式键盘

,或带英文模式的中文微软拼音键盘

.

我的答案

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

如果我错了,请纠正我,但 Java 有 NO 方法可以为某个 IME 或模式选择本机键盘。这是一篇关于 Windows 甚至 Mac 中的 IME 开发的文章。我希望这可以解释很多

http://blog.gatunka.com/2009/09/20/ime-basics-for-developers/

但如果 OP 只是想让用户在密码字段中输入英文,那么他有很多解决方案。但这不是他说的。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我也发过这个,但是被版主删除了。有些输入法有多种选择,有些Windows是国际版,有些是带输入法的英文版。我认为这种行为与 Java 没有任何关系。
    • 我同意这不是语言环境问题,我打算将项目更改为 SWT。 SWT 的对话框完全没有问题
    【解决方案3】:

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

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

    在您的问题中,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 类:

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

    【讨论】:

    • 这不是一个正确的答案,因为这只会将语言更改为 OP 想要的 zh_TW。 OP 想要在语言 zh_TW 中设置为半宽度,这在本答案中描述的任何方法中都无法实现。
    • javax.swing.JComponent.setDefaultLocale(locale);或者 InputContext 给出了我想要的效果,InputContext 可以保留键盘布局,但它没有解决自动切换到全宽问题
    【解决方案4】:

    我做了一个简单的测试:

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

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

    【讨论】:

    • 我也做了同样的测试,但是并没有变成全角模式,而是从中文半角模式变成了“中文(繁体)-快速”英文半角模式。新标签前:i.imgur.com/ypzI902.jpg 新标签后:i.imgur.com/zFCfNuk.jpg
    • 这也与 Windows 区域设置有关。默认输入语言的默认键盘是什么?
    • 中文(繁体)美式键盘,您可以在问题的第一张图片上找到它
    • 我将默认键盘更改为中文 - 快速,它也没有更改为全角
    • 所以如果你的默认键盘是美式中文键盘,那么你点击一个新标签,输入法就变成了美式键盘。更改默认键盘后,是否可以重新启动计算机以再次尝试 IE 新选项卡和 java 应用程序。
    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 2012-05-04
    • 1970-01-01
    • 2013-03-04
    • 2021-08-14
    • 2020-11-14
    • 2017-10-31
    • 2014-02-09
    相关资源
    最近更新 更多