Java SWTのテキスト入力
SWTのテキスト入力・編集環境
SwingやJavaFXはLinux上での日本語入力に問題(Fcitxでインライン入力不可)があったため、SWTを使う方向で検討中です。当然、テキスト欄が必要です。
SWTのテキスト入力ウィジェットは主に下記の2つです(他にもあったらごめんなさい)。
こちらが求めるのは、次のような機能です。いわゆる「Windowsで言うCEdit」です。
- 複数行、長さ無制限テキストの入力ならびに編集(長さは実際は1MiBとかならOK、64KiBとかは不可)
- 文字色、背景色、フォントの変更
- 基本的な編集機能(カット/コピー/ペースト/最低1段階のUndo,Redoを含む)
もっとも、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)で動かしてみると……。
Mozcの変換候補が右にずれてますが、実はウインドウ範囲を越えて未変換文字列を入力しているんです。つまり、表示範囲を越えて入力すると、見えなくなってしまう(変換など動作はします)。これはまずい。
ちなみに、Mint標準のテキストエディタ(pluma)は、フォントをMyricaにしたら行間がおかしくなるのは勘弁してほしいところですが。
とにかく、plumaだと、Windowsの「メモ帳」同様、表示範囲を越えると次の行に表示されます。
また、SWTのTextは、背景色を変更すると、選択範囲が表示されないようです(背景色がデフォルトのままなら、普通にOSデフォルトの選択範囲色になります。自分の環境ではやや暗い緑)。
これは困りました。
ちなみに、TextはWindowsだと1段階のundo/redoができますが、Linux Mintではできませんでした。OSのGUI要素を使うから仕方ないのだけど、対象環境で動かさないとわからないことってありますね。
StyledTextを使ってみる
StyledTextを、ほぼ同様に使ってみましたが、こちらは表示範囲を越えると、右にスクロールしていくのですね。
これはこれで問題ないと思います。また、選択範囲も表示されるので問題なし。
なお、StyledTextはundo/redoがありませんが、実装サンプルは色々あるようです。
Eclipse Tiny Plugins / Blog: Add Undo/Redo Support to Your SWT StyledText-s
しかし、テキストだけでも結構面倒なものですね。