JTextPaneとDocument
普段、Swingでテキスト入力を行うときには、JTextFieldやJTextAreaといったものを利用します。が、これらはマルチフォントに対応していません。マルチフォントでテキストを扱う場合には、「JTextPane」を利用します。このJTextPaneは、「Document」と呼ばれるモデルを持っています。これはテキストを構造的に管理するためのモデルで、このモデルによってシンプルなテキストやHTMLなどさまざまな構造のテキストを扱えるようになります。
マルチフォントを利用する場合には、スタイル付テキストのためのモデル「StyledDocument」と呼ばれるものを利用します。これはインターフェイスですので、通常はこれを実装した「DefaultStyledDocument」と呼ばれるものを使います。例えば、新規にドキュメントをJTextPaneに設定するにはどうすればよいでしょうか。
public void newDoc(){
StyleContext style = new StyleContext();
DefaultStyledDocument doc = new DefaultStyledDocument(style);
textpane.setDocument(doc);
}
StyleContextは、DefaultStyledDocumentのコンテキストとなるオブジェクトです。これを引数に指定してDefaultStyledDocumentインスタンスを作成し、これをJTextPaneにsetDocumentで設定すると、新しいドキュメントとして使えるようになります。
このDefaultStyledDocumentでは、それぞれのキャラクタやパラグラフごとにスタイル情報を設定することができます。これは、アトリビュート(AttributeSet)として用意されており、この中にスタイル情報を設定していきます。このアトリビュートは、通常、AttributeSetを継承した「MutableAttributeSet」というインターフェイスを実装したクラスを使います。クラスライブラリには標準で「SimpleAttributeSet」クラスが用意されています。
例えば、SimpleAttributeSetを作成してフォント名、フォントサイズ、テキストカラーを設定し、ドキュメントの最初の文字にそのスタイルを適用する場合の処理を考えて見ましょう。
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setFontFamily(attr, "Monaco");
StyleConstants.setFontSize(attr,12);
StyleConstants.setForeground(attr,Color.BLACK);
doc.setCharacterAttributes(0,1,attr,true);
「StyleConstants」というのは、スタイル関係の値やそのためのメソッドなどを持つコレクションクラスで、ここに用意されているメソッドを呼び出すことで、指定のAttributeSetにスタイル情報を組み込むことができます。
ここでは「setFontFamily」「setFontSize」「setForeground」といったメソッドを使っていますね。これらはそれぞれフォントファミリー名、フォントサイズ、テキストカラーを設定する働きをします。いずれも第1引数に割り付けるAttributeSetを、第2引数に設定する値を指定します。
こうして作成したAttributeSetを、StyledDocumentの「setCharacterAttributes」を使ってドキュメントに設定します。このメソッドは、適応するキャラクタの場所を示すint値2つ(開始位置とキャラクタ数)、適用するAttributeSet、古い属性を置換するかどうかを示すboolean値の4つの引数で指定されます。
StyleConstantsには、この他にもボールドやイタリックのスタイル、背景色などのスタイルを設定するためのメソッド類が用意されています。興味のある人は調べてみると面白いでしょう。