はじめに
今回は、マルチフォントについて考えてみましょう。Swingには、JTextPaneというマルチフォントに対応したテキスト編集用コンポーネントがあります。これを利用すれば、マルチフォントのテキストを扱うことが可能です。
また、マルチフォントのテキストは、そのままテキストファイルに保存できません。RTFなどのファイルに書き出す必要があります。
こうしたマルチフォント関係の機能は、意外と使ったことがない人は多いはずです。ここで、その基本的な仕組みと利用方法について理解しておきましょう。
対象読者
- Javaの基本機能は一通り覚えた、というビギナーを卒業しかけている人。
- Swingはマスターした? といわれると、ちょっと自信がない人。
- これからはクライアントサイドが注目されると信じる人。
JTextPane利用の基本
まずは、JTextPaneを使ったマルチフォントの表示から説明をしていくことにしましょう。JTextPaneは、JTextAreaなどと同様に複数行のテキストを編集するコンポーネントです。これ自体にはスクロールバーなどはないので、利用の際にはあわせてJScrollPaneを利用することになります。
通常は、ただJTextPaneを組み込むだけでいいのですが、実際にマルチフォントのテキストを利用しようということになると、これだけでは足りません。javax.swing.textパッケージの「Document」と呼ばれる、コンポーネントのテキストを保管するクラスを用意する必要があります。これは、前回のJListなどでも登場した「モデル」に相当する役目を果たすものと考えればよいでしょう。Documentがテキスト情報を管理し、それを下にJTextPaneに表示がされる、というわけです。
このDocumentは、表示するテキストの種類(というと分かりにくいですが、要するにどのようなテキストを表示させるか)によって複数のものが用意されています。マルチフォントのテキストを表示する場合には、「StyledDocument」を利用します。といっても、これはインターフェースですので、通常はこれを実装したクラスとして標準で用意されている「DefaultStyledDocument」クラスを利用すのが一般的です。
では、実際にDefaultStyledDocumentを設定してJTextPaneを使用する基本について、簡単なサンプルを作成しながら考えていくことにしましょう。まずは、ベースとなる簡単なアプリケーションを作成しておきます。今回は、jp.codezine.SampleAppクラスというアプリケーションクラスを用意することにします。
package jp.codezine; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; public class SampleApp extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; JTextPane pane; public SampleApp(){ this.setSize(new Dimension(400,300)); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); createMenuBar(); pane = new JTextPane(); JScrollPane scroll = new JScrollPane(pane); scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); this.add(scroll,BorderLayout.CENTER); StyleContext style = new StyleContext(); DefaultStyledDocument doc = new DefaultStyledDocument(style); pane.setDocument(doc); pane.setText("Hello Multi Font."); } // メニューバーの組み込み public void createMenuBar(){ JMenuBar menubar = new JMenuBar(); JMenu menu = new JMenu("Test"); menubar.add(menu); JMenuItem menuitem = new JMenuItem("do test"); menuitem.addActionListener(this); menu.add(menuitem); this.setJMenuBar(menubar); } @Override public void actionPerformed(ActionEvent e) { // ここに実行する処理を書く } public static void main(String[] args){ SampleApp app = new SampleApp(); app.setVisible(true); } }
これは、実験用のメニュー項目1つとJTextPaneを1つ持つだけのシンプルなJFrameベース・アプリケーションです。JTextPaneには、DefaultStyledDocumentが設定されています。では、この設定の処理を見てみましょう。
StyleContext style = new StyleContext();
まず、javax.swing.text.StyleContextクラスのインスタンスを作成します。このStyleContextは、テキストスタイルに関連するリソース類をプールするためのクラスです。スタイルに関する各種の定義などをここにキャッシュし保管します。
DefaultStyledDocument doc = new DefaultStyledDocument(style);
StyleContextを引数に指定して、DefaultStyledDocumentインスタンスを作成します。このDefaultStyledDocumentは、他に引数なしや、AbstractDocument.ContentとStyleContextを引数に持つコンストラクタなどが用意されていますが、ここではStyleContextを設定してDefaultStyledDocumentを用意するやり方を用いることにします。
pane.setDocument(doc);
そして、最後にDefaultStyledDocumentをJTextPaneにsetDocumentで設定して、基本的な処理は完了です。
これで、下準備はできました。ここでは、メニューを選んだときに実行されるactionPerformedに必要な処理を書いて、さまざまな実験をしていくことにしましょう。