DocumentとJTextComponent

広告

まずJavaでテキスト関係の処理をする場合に用意されているクラスなどを調べてみましょう。テキスト関係では、どのように表示するかを管理するJTextComponentと、実際のデータを保存するDocumentの2つを考える必要があります。

順にこの2つを見てみましょう。

JTextComponentクラス

JTextComponentクラスは、JTextAreaやJTextFieldの親クラスです。クラス図は下記のようになっています。

public abstract class JTextComponent
extends JComponent implements Scrollable, Accessible
java.lang.Object
 L java.awt.Component
     L java.awt.Container
         L javax.swing.JComponent
             L javax.swing.text.JTextComponent

このクラスはabstractクラスなので、実際にはサブクラスを利用します。用意されているサブクラスは下記となります。

JTextComponent --+-- JTextField -- JPasswordField
                 |
                 +-- JTextArea
                 |
                 +-- JEditorPane -- JTextPane

JTextFieldとJPasswordFieldは1行だけのテキストを表示する場合に利用します。JTextAreaは複数行になるテキストを表示する場合に利用します。最後のJEditorPaneとJTextPaneも複数行のテキストを表示しますが、スタイル付きのテキストを表示する場合に利用します。

JEditorPaneは主にHTMLなどを表示する場合に利用し、JTextPaneはもう少し汎用的に使いたい場合に利用すると考えておけばいいのではないでしょうか。今回はHTMLを使うというわけではないので、JTextPaneをベースに作成していきます。

JTextPaneクラス

ではJTextPaneクラスについてもう少し詳しく見ていきましょう。クラス図は下記のようになっています。

public class JTextPane
extends JEditorPane
java.lang.Object
 L java.awt.Component
     L java.awt.Container
         L javax.swing.JComponent
             L javax.swing.text.JTextComponent
                 L javax.swing.JEditorPane
                     L javax.swing.JTextPane

コンストラクタは下記の2つが用意されています。

コンストラクタの概要
JTextPane()
新しい JTextPane を生成します。
JTextPane(StyledDocument doc)
新しい JTextPane を指定されたドキュメントモデルで生成します。

1番目のコンストラクタは空のコンストラクタです。2番目は初期値として表示するDocumentを指定して作成します。引数の型がStyledDocumentとなっていますが、これはスタイル付きの文書を表わすクラスとなっています。(これは後で詳しく見てみます)。

では取り合えず1番目のコンストラクタを使って試してみます。

import javax.swing.*;

public class TextPaneTest extends JFrame{

  public static void main(String[] args){
    TextPaneTest test = new TextPaneTest();

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  TextPaneTest(){
    setTitle("TextPaneTest Test");
    setBounds( 10, 10, 300, 200);

    JTextPane textPane = new JTextPane();
    JScrollPane scroll = new JScrollPane(textPane, 
      JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
      JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    getContentPane().add(scroll);
  }
}

実行結果は下記のようになります。

JTextPane

試しに何か文字を入力してみると、

JTextPane

ここまでは書式も何もないものですが、書式を設定できるようにしていきましょう。

Documentインターフェース

スタイル付きのテキストを表示するための箱は先ほどのJTextPaneクラスを使えばいいですが、どんな文書が含まれているかの管理をするのがDocumentインターフェースを実装したクラスになります。

スタイル付きの文書を管理する場合には、DocumentインターフェースのサブインターフェースであるStyledDocumentインターフェースを実装したクラスを使います。Document及びStyledDocumentを実装したクラスとしては下記のようなものがあるようです。

AbstractDocument --+-- PlainDocument
(Document)         |      (Document)
                   |
                   +-- DefaultStyledDocument -- HTMLDocument
                          (StyledDocument)      (StyledDocument)

上記を見ていただくと分かる通り、AbstractDocumentが基本クラスになります。スタイルが無い場合にはPlainDocumentを、スタイル付きの場合にはDefaultStyledDocumentかHTMLDocumentを使います。

今回はスタイル付きですからDefaultStyledDocumentクラスを使いましょう。クラス図は下記のようになります。

public class DefaultStyledDocument
extends AbstractDocument implements StyledDocument
java.lang.Object
 L javax.swing.text.AbstractDocument
     L javax.swing.text.DefaultStyledDocument

コンストラクタは下記の3つが用意されています。

コンストラクタの概要
DefaultStyledDocument()
デフォルトの書式付きドキュメントを構築します。
DefaultStyledDocument(AbstractDocument.Content c, StyleContext styles)
書式付きドキュメントを構築します。
DefaultStyledDocument(StyleContext styles)
デフォルトのコンテンツ記憶域の実装と書式の共有セットを使って、書式付きドキュメントを構築します。

よく利用されている3番目のコンストラクタを見てみましょう。

デフォルトのコンテンツ記憶域の実装と書式の共有セットを使って、書式付きドキュメントを構築し
ます。

パラメータ:
  styles - 書式

StyleContextはスタイル情報を保存するためのクラスです。このコンストラクタではスタイル情報を保存する入れ物を指定してDefaultStyledDocumentクラスのオブジェクトを作成します。

では、ここでStyleContextクラスについても見ておきます。

public class StyleContext
extends Object implements Serializable, AbstractDocument.AttributeContext
java.lang.Object
 L javax.swing.text.StyleContext

コンストラクタは下記の1つが用意されています。

コンストラクタの概要
StyleContext()
新しい StyleContext オブジェクトを作成します。

実際の使い方は下記のようになります。

StyleContext sc = new StyleContext();
DefaultStyledDocument doc = new DefaultStyledDocument(sc);

これでスタイルまで保存できるドキュメントオブジェクトが作成できました。これを表示の方を管理しているJTextPaneクラスのオブジェクトにセットします。それにはJTextPaneクラスのsetDocumentメソッドを使います。

エディタをテキストドキュメントに関連付けます。これは StyledDocument でなければなりません。

パラメータ:
  doc - 表示および編集するドキュメント
例外:
  IllegalArgumentException - doc をこのテキストコンポーネントに必要な型のモデルである 
    StyledDocument にナロー変換できない場合

このメソッドを使ってドキュメントクラスのオブジェクトをセットします。実際の使い方は下記のようになります。

TextPane textPane = new JTextPane();

StyleContext sc = new StyleContext();
DefaultStyledDocument doc = new DefaultStyledDocument(sc);

textPane.setDocument(doc);

これで下準備は完了です。次のページで実際にフォントやBoldなどの設定をできるようにしてみます。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)