S-JIS[2009-04-19] 変更履歴

JTextComponent(Swing)

JTextComponentは、 テキスト(文字列)を扱う(入力/編集・表示)を行うコンポーネントの共通クラス。


テキストコンポーネントの種類

テキストコンポーネント 使用用途 備考 Document
JTextField 1行テキスト 改行なしで装飾なしの文字列を扱う。 PlainDocument
JTextArea 複数行プレインテキスト 複数行で装飾なしの文字列を扱う。 PlainDocument
JTextPane 複数行スタイルテキスト 複数行で装飾つきの文字列を扱う。 DefaultStyledDocument
JEditorPane HTML HTMLを扱う。(HTMLの編集も可) HTMLDocument

装飾と言っているのは、書式(フォント)や色や太字・斜体や下線などのこと。
StyleConstants・AttributeSet

テキストコンポーネントでは、実際の文字列(String)はドキュメント(javax.swing.text.Document)で管理している。
表示上は改行付きの文字列であっても、PlainDocument内では“改行コード\nの入った”ひとつの文字列として扱われている。(つまり、単純に行番号を指定して行を扱うことは出来ない)
キャレットの位置や選択範囲の開始終了位置などは、その文字列内のオフセットとして表される。


便利そうなメソッド

JTextComponentのメソッド
メソッド クラス 説明
TC TF TA TP EP
テキスト setText(String str) 文字列をセットする。
append(String str)         文字列を追加する。
replaceSelection(String str)       選択されている文字列を置き換える。
getText() 文字列を取得する。
getText(int offs, int len) 指定された範囲の文字列を取得する。
getSelectedText() 選択されている文字列を取得する。
選択 select(int start, int end) 文字列を選択する。
selectAll() 文字列を全選択する。
getSelectionStart() 選択されている開始位置を取得する。
getSelectionEnd() 選択されている終了位置を取得する。
キャレット setCaretPosition(int pos) キャレットの位置を設定する。
getCaretPosition() キャレットの位置を取得する。
getCharacterAttributes()         キャレット位置の属性(修飾)を取得する。
setCaret(Caret c) キャレット(描画に使うオブジェクト)を設定する。
getLineCount()         行数を取得する。
getLineStartOffset(int line)
getLineEndOffset(int line)
   
    行の開始・終了位置を取得する。
setLineWrap(boolean b)       行の末端まで達した場合の折り返しの有無を設定する。
setWrapStyleWord(boolean b)         行の末端にある単語をどこで切るか設定する。
フォント setFont(Font f) フォントを変更する。
後からフォントを設定すると、フォント系属性の指定がされていない文字列は全てそのフォントの影響を受ける。
ドキュメント getDocument() ドキュメントを取得する。
getStyledDocument()         getDocument()と同じだが、戻り値はStyledDocumentにキャストされている。
ドラッグ&ドロップ setDropMode(DropMode mode) ドロップの受け付けを設定する。
setDragEnabled(boolean b) ドラッグ可否を設定する。

テキストの設定・取得に関しては、文字列全体の設定・取得(setText()getText())や選択されている文字列に関するものしか無い。
途中に挿入したり装飾つきで追加したりしたい場合は、ドキュメントを取得し、そのドキュメントのメソッドを呼び出す。

Documentのメソッド
メソッド クラス 説明
D AD PD SD HD
getLength() 文字数を取得する。
getText(int offs, int len) 指定範囲の文字列を取得する。
全文字列を取得したい場合は「doc.getText(0, doc.getLength())」とする。
insertString(int offs, String str, AttributeSet attr) 文字列を挿入する。
先頭に入れる場合はoffsを0、末尾に追加したい場合はgetLength()を指定する。
修飾が無い場合はattrはnullでよい。
replace(int offs, int len, String str, AttributeSet attr)   指定範囲の文字列を置換する。
remove(int offs, int len) 指定範囲の文字列を削除する。

装飾(属性:AttributeSet)は、スタイル(javax.swing.text.StyleConstants)の集合で表す。
AttributeSetはインターフェースなので、実際には具象クラスであるSimpleAttributeSetを使う。
そこに指定する具体的な値は、StyleConstantsで定義されている。

import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
		JTextPane tp = new JTextPane();

		SimpleAttributeSet attr = new SimpleAttributeSet();
		StyleConstants.setBold(attr, true);		//太字にする
		StyleConstants.setUnderline(attr, true);		//下線を引く
		StyleConstants.setForeground(attr, Color.RED);	//赤字にする

		Document doc = tp.getDocument();
		try {
			doc.insertString(doc.getLength(), "赤くて太くてアンダーライン", attr);
		} catch (BadLocationException e) {
			e.printStackTrace();
		}

setBold()等のメソッドを使う代わりに、直接AttributeSetに値をセットすることも出来る。

		SimpleAttributeSet attr = new SimpleAttributeSet();
		attr.addAttribute(StyleConstants.Bold, Boolean.TRUE);	//太字にする
		attr.addAttribute(StyleConstants.Underline, Boolean.TRUE);	//下線を引く
		attr.addAttribute(StyleConstants.Foreground, Color.RED);	//赤字にする

ただ、引数の型を間違うなんてバグを起こさない為に、前者の方法を使う方がいいんじゃないかと思う。

※JComponentにはsetFont()Fontを指定することが出来る。
 StyleConstantsによってフォント関連の属性(FontFamilyBold,ItalicFontSize)を指定しなかった場合は、setFont()で指定されたFontが使われる。


Swing目次へ戻る / Java目次へ戻る
メールの送信先:ひしだま