ugnagブログ

たいした内容はありません。思いつきで書いているだけ。
開発日記がメインかな。

<< 笑の大学 | main | CD整理3 >>

JTextPane

APIの使い方を書こうと思う。

今回は、javax.swing.JTextPaneを紹介。
JEditorPaneはよく使っていたが、JTextPaneは使ったことがなかった。

今回、書式付きのテキスト入力画面がどうしても欲しかったので、
いろいろと調べたらこのクラスで可能なことが判明した。


これを使えば、JTextAreaのような入力を色つきで行える。

従って、テキストエディターのように、キーワード部分だけ色を付けることが可能だ。


試しに「行の先頭文字だけを強調にする」というのをしてみた。

最初は、KeyListenerを使い、キー入力されたときタイミングで、ドキュメントをすべて調べ属性を再設定する、という処理にした。

これが見事に失敗。

このタイミングではドキュメントはロックされているようで、例外が発生する。


次にやったのは、javax.swing.text.DefaultStyledDocumentを拡張して、
insertString、removeメソッドをオーバーライドする。



public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException
{

super.insertString(offs, str, a);

this.resetAttributes(offs, str.length());

}


こんな感じ。

つまり、まずDefaultStyledDocumentにドキュメントの内容(テキスト)を変更させ、変更されたテキストを見て、書式を再設定する。

この処理方式はうまくいった。

キー入力をして、内容を変更すると、リアルタイムで属性が変更される。
もちろん、クリップボードからペーストしてもうまくいく。

応用すれば、テキストエディターも作れると思う。
(大変な作業だが。。。)


では、書式の変更の方法だ。

たとえば、ドキュメントのオフセット10から3文字の色を赤にする。

--------------------------------------------------------
1://ドキュメントを準備
2:StyleContext sc = new StyleContext();
3:DefaultStyledDocument doc = new DefaultStyledDocument(sc);
4:
5://
6:SimpleAttributeSet attr = new SimpleAttributeSet();
7:StyleConstants.setForeground(attr, Color.red);
8:doc.setCharacterAttributes(10, 3, attr, false)
--------------------------------------------------------

8行目がポイントだ。ここで、ドキュメントに属性を設定している。
第4引数のfalseは、属性変更時に、attrで指定された以外の属性をどうするかということ。trueにすればattrで指定したものだけが有効になる。

今回の場合、この位置のの属性が、「青で強調」だったとすると、
第4引数をfalseにすれば、「赤で強調」に変わる。
trueにすれば、「赤」だけになる。

6行目はパラメータとなるクラスを生成。
7行目はパラメータに値を設定。
attrに直接設定しても構わないが、キーを間違えないためにもこの方法がいいだろう。
AttributeSetはMapのようなもので、キーと値をセットで持っている。
キーは文字列なわけだが、この文字列を間違えると、属性は変更できない。

2行目だが、書式用の場所を提供している。
デフォルトがどうなるのか、よくわからないので、指定した方が無難だ。



表示するだけなら、JEditorPaneを使って、HTMLを表示すれば簡単だが、
入力の必要があるときは、このJTextPaneが役に立つだろう。
JAVA | comments (0) | -

Comments

Comment Form

本文に書いて下さい
本文にh抜きで書いて下さい