Top > Blog > Programming

SWT で IME を制御する

UI を作成していると、入力欄にフォーカスが当たった時に、IME の入力モードをオフ(半角英数字入力)に切り替えたい時などがあります。 ただし IME の制御は Windows API 等を使わなければず、 Java からの制御は難しいのかな…と思っていたら、さすがに SWT では簡単にできるようです。

ただし、出来る範囲は限られているように思います。下記にサンプルと検証結果を示します。

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class IMESample {
    
    public static void main(String[] args) {
        
        Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setText("IME Sample");
        GridLayout layout = new GridLayout(2, false);
        shell.setLayout(layout);
        
        create(shell, SWT.NONE);
        create(shell, SWT.ROMAN);
        create(shell, SWT.DBCS);
        create(shell, SWT.PHONETIC);
        create(shell, SWT.NATIVE);
        create(shell, SWT.ALPHA);
        
        shell.setSize(400,240);
        shell.open();
        while (!shell.isDisposed()){
            if (!display.readAndDispatch()){
                display.sleep();
            }
        }
        display.dispose();        
    }
    
    private static void create(final Shell shell, final int style) {
        Label label = new Label(shell, SWT.LEFT);
        switch(style) {
            case SWT.NONE     : label.setText("SWT.NONE"); break;
            case SWT.ROMAN    : label.setText("SWT.ROMAN"); break;
            case SWT.DBCS     : label.setText("SWT.DBCS"); break;
            case SWT.PHONETIC : label.setText("SWT.PHONETIC"); break;
            case SWT.NATIVE   : label.setText("SWT.NATIVE"); break;
            case SWT.ALPHA    : label.setText("SWT.ALPHA"); break;
            default : break;
        }
        Text text = new Text(shell, SWT.SINGLE|SWT.BORDER);
        GridData data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        text.setLayoutData(data);
        text.addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                shell.setImeInputMode(style);
            }
        });
    }
}
実行画面
  ※ SWT.ALPHA では半角英数字入力だが、 IME が on なので確定候補が表示される(画面はATOK16での入力例)。
実行画面

検証結果

確認した環境は

  • Windows 2000
  • JDK 1.3.1_04 (SunMicrosystems)

です。

検証結果 – ATOK16
指定したスタイルビット SWT 2.1.3 (ATOK16) SWT 3.0 M8 (ATOK16)
SWT.NONE IME 入力オフ IME 入力オフ
SWT.ROMAN IME 入力オフ IME 入力オフ
SWT.DBC 全角アルファベット入力 全角アルファベット入力
SWT.PHONETIC 半角カタカナ入力
(キーは50音入力)
半角カタカナ入力
(キーは50音入力)
SWT.NATIVE 全角ひらがな入力
(キーは50音入力)
全角ひらがな入力
(キーは50音入力)
SWT.ALPHA 半角アルファベット入力 半角アルファベット入力
検証結果 – MS-IME2000
指定したスタイルビット SWT 2.1.3 (MS-IME2000) SWT 3.0 M8 (MS-IME2000)
SWT.NONE IME 入力オフ IME 入力オフ
SWT.ROMAN IME 入力オフ IME 入力オフ
SWT.DBC 全角アルファベット入力 全角アルファベット入力
SWT.PHONETIC 半角カタカナ入力
(キーはローマ字入力)
半角カタカナ入力
(キーはローマ字入力)
SWT.NATIVE 半角カタカナ入力
(キーはローマ字入力)
半角カタカナ入力
(キーはローマ字入力)
SWT.ALPHA 半角アルファベット入力 半角アルファベット入力

コメントの投稿