11

我有几种 Windows 7 附带的用于书写(繁体中文)台湾语的输入法。此外,所有输入法都可以选择切换字符宽度(单字节/双字节字符)。

  • 中文(繁体) - 新快
  • 中文(繁体) - ChangJie
  • 中文(繁体) - 快速
  • 中文(繁体) - 拼音
  • 中文(繁体) - 新音标
  • 中文(繁体)- 新昌颉

如果我在 Java 应用程序中选择其中一种输入法并将字符宽度设置为半角(单字节字符模式),我可以在 JTextField 中成功输入文本。但是,如果应用程序显示一些对话框(例如JOptionPane)或弹出窗口,输入法字符宽度会自动变为全角(双字节字符模式)。之后,用户必须手动切换到半角字符。

我可以使用 Java 类“InputContext”以编程方式打开或关闭输入法,但我无法控制输入法是否设置为全角/半角(单/双字节)字符模式。

我想也许可以从 Windows 输入法设置中禁用它,但是没有与自动切换字符宽度相关的选项。

问题是:有没有办法处理(禁用)这种自动切换?

以下是使用上述输入法进行测试的示例代码:

public class Example implements ActionListener {

    JFrame f = new JFrame("pasod");
    JTextField txt = new JTextField();
    Button btn = new Button("Locale");

    public Example() {

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout());
        btn.addActionListener(this);
        panel.add(btn);
        panel.add(txt);
        f.add(panel);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setSize(800, 100);
        f.setVisible(true);
    }   

    public static void main(String[] args) {
        new Example();              
    }

    public void actionPerformed(ActionEvent arg0) {
        JOptionPane.showMessageDialog(btn, "Neso", "Neso",
                 JOptionPane.INFORMATION_MESSAGE);
    }
}

谢谢。

4

2 回答 2

1

好的,我通过 Java 源代码进行了跟踪,寻找任何突出的东西;

JOptionPane.showMessageDialog()将此重载称为JOptionPane.showOptionDialog();

public static int showOptionDialog(Component parentComponent,
        Object message, String title, int optionType, int messageType,
        Icon icon, Object[] options, Object initialValue) 
        throws HeadlessException {
        JOptionPane             pane = new JOptionPane(message, messageType,
                                                       optionType, icon,
                                                       options, initialValue);

        pane.setInitialValue(initialValue);
        pane.setComponentOrientation(((parentComponent == null) ?
        getRootFrame() : parentComponent).getComponentOrientation());

        int style = styleFromMessageType(messageType);
        JDialog dialog = pane.createDialog(parentComponent, title, style);

        pane.selectInitialValue();
        dialog.show();    
        //..Result handling code
    }

所以我们调查createDialog()

public JDialog createDialog(String title) throws HeadlessException {
    int style = styleFromMessageType(getMessageType());
    JDialog dialog = new JDialog((Dialog) null, title, true);
    initDialog(dialog, style, null);
    return dialog;
}

所以我们检查JDialog所有这些调用的构造函数dialogInit()

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

在这里我们找到了setLocale( JComponent.getDefaultLocale() );

因此,每当您创建 JDialog 时,它都会出现,无论它是否是间接的,程序的语言环境是否重置为默认值,我猜这包括重置您的输入设置。

有几种方法可以设置默认语言环境(以编程方式、系统属性或运行时参数);在此处找到详细信息

希望对你有帮助

于 2013-08-04T22:23:11.497 回答
1

我做了一个简单的测试:

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

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

于 2014-07-06T14:07:42.687 回答