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 JEditorPanejava.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);
}
}
実行結果は下記のようになります。
試しに何か文字を入力してみると、
ここまでは書式も何もないものですが、書式を設定できるようにしていきましょう。
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番目のコンストラクタを見てみましょう。
public DefaultStyledDocument(StyleContext styles)
デフォルトのコンテンツ記憶域の実装と書式の共有セットを使って、書式付きドキュメントを構築し ます。 パラメータ: 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メソッドを使います。
public void setDocument(Document doc)
エディタをテキストドキュメントに関連付けます。これは 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 )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。