11

Windows 7 に付属している (繁体字中国語) 台湾語を書くための入力方法がいくつかあります。また、すべての入力方法には、文字幅 (1 バイト/2 バイト文字) を切り替えるオプションがあります。

  • 中国語 (繁体字) - 新しいクイック
  • 中国語 (繁体字) - ChangJie
  • 中国語 (繁体字) - クイック
  • 中国語 (繁体字) - ふりがな
  • 中国語 (繁体字) - 新音声
  • 中国語 (繁体字) - New ChangJie

Java アプリケーションでこれらの入力方法のいずれかを選択し、文字幅を半角 (半角文字モード) に設定すると、JTextField にテキストを正常に入力できます。ただし、アプリケーションが何らかのダイアログ ボックス (JOptionPane など) やポップアップ ウィンドウを表示する場合、インプット メソッドの文字幅は自動的に全角 (2 バイト文字モード) に変更されます。その後、ユーザーは手動で半角文字に切り替える必要があります。

Java クラス「InputContext」を使用してプログラムでインプット メソッドのオンとオフを切り替えることはできますが、インプット メソッドが全角/半角 (1 バイト/2 バイト) 文字モードに設定されているかどうかを制御できません。

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

簡単なテストを行いました:

IE を開いてタブを選択し、アドレス バーで中国語 IME を半角に設定しました。次に、別のタブをクリックすると、IME が自動的に全幅に変更されます。

したがって、Java とは何の関係もないと思います。これは Windows の動作です。

于 2014-07-06T14:07:42.687 に答える
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これらすべての callのコンストラクターをチェックします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を作成するたびに表示されます。これには、入力設定のリセットが含まれると思います。

デフォルトの Locale を設定する方法はいくつかあります (プログラム、システム プロパティ、またはランタイム引数)。詳細はこちら

それがあなたを助けることを願っています

于 2013-08-04T22:23:11.497 に答える