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が役に立つだろう。
今回、書式付きのテキスト入力画面がどうしても欲しかったので、
いろいろと調べたらこのクラスで可能なことが判明した。
これを使えば、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