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)
です。
| 指定したスタイルビット | 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 | 半角アルファベット入力 | 半角アルファベット入力 | 
| 指定したスタイルビット | 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 | 半角アルファベット入力 | 半角アルファベット入力 | 
 RSS
 RSS