読者です 読者をやめる 読者になる 読者になる

Java SWTのテキスト入力

SWTのテキスト入力・編集環境

SwingやJavaFXLinux上での日本語入力に問題(Fcitxでインライン入力不可)があったため、SWTを使う方向で検討中です。当然、テキスト欄が必要です。

SWTのテキスト入力ウィジェットは主に下記の2つです(他にもあったらごめんなさい)。

こちらが求めるのは、次のような機能です。いわゆる「Windowsで言うCEdit」です。

  • 複数行、長さ無制限テキストの入力ならびに編集(長さは実際は1MiBとかならOK、64KiBとかは不可)
  • 文字色、背景色、フォントの変更
  • 基本的な編集機能(カット/コピー/ペースト/最低1段階のUndo,Redoを含む)

SWTはネイティブGUIを使うのだから、きっと余裕なはず。

もっとも、StyledTextはクラス継承関係がちょっと不安(親クラスがCanvasなので独自実装と推測)。

Textを使ってみる

最初、Textは色を設定できないのでは?と思ったのですが、実際には継承元の1つ、ControlにsetForeground/setBackgroundメソッドがあるのですね。Windowsのメモ帳と比べると少し重いけど、まあ許容範囲。

public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    final Text text = new Text(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
    text.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
    text.setForeground(display.getSystemColor(SWT.COLOR_GRAY));

    Font font = text.getFont();
    FontData[] fontData = font.getFontData();
    for (FontData fd : fontData) {
        fd.setHeight(24);
    }
    Font newFont = new Font(display,fontData);
    text.setFont(newFont);

    shell.setSize(400, 300);
    shell.open();
    while(!shell.isDisposed()) {
        if (!display.readAndDispatch()) { display.sleep(); }
    }
    display.dispose();
}

しかし、Linux (Mint17.2)で動かしてみると……。

f:id:mokake:20151107191743p:plain

Mozcの変換候補が右にずれてますが、実はウインドウ範囲を越えて未変換文字列を入力しているんです。つまり、表示範囲を越えて入力すると、見えなくなってしまう(変換など動作はします)。これはまずい。

ちなみに、Mint標準のテキストエディタ(pluma)は、フォントをMyricaにしたら行間がおかしくなるのは勘弁してほしいところですが。

myrica.estable.jp

とにかく、plumaだと、Windowsの「メモ帳」同様、表示範囲を越えると次の行に表示されます。

f:id:mokake:20151107192427p:plain

また、SWTのTextは、背景色を変更すると、選択範囲が表示されないようです(背景色がデフォルトのままなら、普通にOSデフォルトの選択範囲色になります。自分の環境ではやや暗い緑)。

これは困りました。

ちなみに、TextはWindowsだと1段階のundo/redoができますが、Linux Mintではできませんでした。OSのGUI要素を使うから仕方ないのだけど、対象環境で動かさないとわからないことってありますね。

StyledTextを使ってみる

StyledTextを、ほぼ同様に使ってみましたが、こちらは表示範囲を越えると、右にスクロールしていくのですね。

f:id:mokake:20151107193519p:plain

これはこれで問題ないと思います。また、選択範囲も表示されるので問題なし。

なお、StyledTextはundo/redoがありませんが、実装サンプルは色々あるようです。

Eclipse Tiny Plugins / Blog: Add Undo/Redo Support to Your SWT StyledText-s

www.java2s.com

しかし、テキストだけでも結構面倒なものですね。