モジュール java.desktop
パッケージ javax.swing.text.html

クラスHTMLDocument

java.lang.Object
すべての実装されたインタフェース:
Serializable, Document, StyledDocument

public class HTMLDocument extends DefaultStyledDocument
HTMLをモデル化するドキュメントです。 このモデルの目的は、ドキュメントのブラウズと編集の両方をサポートすることです。 このため、HTMLドキュメントによって記述された構造は、デフォルトでは正確にレプリケートされません。 デフォルトでモデル化される要素構造は、HTMLDocument.HTMLReaderクラスによって構築されます。このクラスは、パーサーに必要なHTMLEditorKit.ParserCallbackプロトコルを実装しています。 構造を変更するには、HTMLReaderをサブクラス化し、getReader(int)メソッドを実装し直して新しいリーダーの実装を返すようにします。 生成されるデフォルトの構造については、HTMLReaderのドキュメントを参照してください。 デフォルトの構造は、ドキュメントのコンテンツが損なわれないことを意図して実装されていますが、HTMLフォーマットを生成し直すときに異なったフォーマットになることもあります。

このドキュメントはHTMLをモデル化するだけで、ビューの属性をその中に格納しようとはしません。 要素は、StyleContext.NameAttribute属性によって識別されます。この属性は必ず、要素の種類を識別するHTML.Tag型の値を持っています。 要素の中には合成されるもの(コメントなど)もあります。 HTMLFactoryはこの属性を使用して、構築するビューの種類を決定します。

このドキュメントは、追加読込みをサポートしています。 TokenThresholdプロパティにより、どれくらいの量の解析がバッファに格納されるとドキュメントの要素構造の更新を行うかを制御します。 このプロパティは、EditorKitで設定されるため、サブクラスから無効にすることができます。

Baseプロパティは、相対URLをどのURLに対して解決するかを決定します。 プロパティの値がURLの場合、デフォルトでは、これはDocument.StreamDescriptionPropertyになります。 <BASE>タグが検出された場合、ベースは、そのタグで指定されたURLになります。 ベースURLはプロパティなので、直接設定できます。

このドキュメントで使用するデフォルトのコンテンツ・ストレージ・メカニズムは、ギャップ・バッファ(GapContent)です。 別のメカニズムを指定するには、Contentの実装を引数に取るコンストラクタを使います。

HTMLDocumentの変更

HTMLDocumentを変更するためにDocumentやStyledDocumentによって提供されているメソッドのほかに、HTMLDocumentにはいくつかの簡易メソッドも用意されています。 次のメソッドを使用すると、HTMLコンテンツを既存のドキュメントに挿入できます。

次の例は、これらのメソッドの使用方法を示しています。 各例では、HTMLドキュメントが次の方法で初期化されることを前提としています。

 JEditorPane p = new JEditorPane();
 p.setContentType("text/html");
 p.setText("..."); // Document text is provided below.
 HTMLDocument d = (HTMLDocument) p.getDocument();
 

次のHTMLコンテンツでは

 <html>
   <head>
     <title>An example HTMLDocument</title>
     <style type="text/css">
       div { background-color: silver; }
       ul { color: blue; }
     </style>
   </head>
   <body>
     <div id="BOX">
       <p>Paragraph 1</p>
       <p>Paragraph 2</p>
     </div>
   </body>
 </html>
 

HTMLドキュメントを変更するためのすべてにメソッドにElementが必要です。 HTMLドキュメントから要素を取得するには、getElement(Element e, Object attribute, Object value)メソッドを使用します。 それは、深さ優先順で、指定された値を持つ指定された属性を含む最初の子孫の要素を返します。 たとえば、d.getElement(d.getDefaultRootElement(), StyleConstants.NameAttribute, HTML.Tag.P)は最初の段落要素を返します。

要素を検索するための便利で簡単な方法はgetElement(String)メソッドであり、これは指定された値に一致するID属性を持つ要素を返します。 たとえば、d.getElement("BOX")DIV要素を返します。

また、getIterator(HTML.Tag t)メソッドも、ドキュメント内の指定されたHTMLタグのすべての出現箇所を検索するために使用できます。

要素の挿入

葉以外の要素の既存の子の前後に要素を挿入するには、insertAfterStartおよびinsertBeforeEndメソッドを使用します。 たとえば、eDIV要素である場合、d.insertAfterStart(e, "<ul><li>List Item</li></ul>")は最初の段落の前にそのリストを挿入し、d.insertBeforeEnd(e, "<ul><li>List Item</li></ul>")は最後の段落のあとにそのリストを挿入します。 DIVブロックは、新しく挿入された要素の親になります。

いずれかの要素の前後に兄弟要素を挿入するには、insertBeforeStartおよびinsertAfterEndメソッドを使用します。 たとえば、eDIV要素である場合、d.insertBeforeStart(e, "<ul><li>List Item</li></ul>")DIV要素の前にそのリストを挿入し、d.insertAfterEnd(e, "<ul><li>List Item</li></ul>")DIV要素のあとにそのリストを挿入します。 新しく挿入された要素は、DIV要素の兄弟になります。

要素の置換

要素とそのすべての子孫を置換するには、setInnerHTMLおよびsetOuterHTMLメソッドを使用します。 たとえば、eDIV要素である場合、d.setInnerHTML(e, "<ul><li>List Item</li></ul>")はすべての子の段落をそのリストに置換し、d.setOuterHTML(e, "<ul><li>List Item</li></ul>")DIV要素自体を置換します。 後者の場合、そのリストの親はBODY要素になります。

サマリー

次の表に、前述のドキュメントの例と各種メソッドの結果を示します。

上記の例のHTMLコンテンツ
insertAfterStart insertBeforeEnd insertBeforeStart insertAfterEnd setInnerHTML setOuterHTML

Paragraph 1

Paragraph 2

  • List Item

Paragraph 1

Paragraph 2

Paragraph 1

Paragraph 2

  • List Item
  • List Item

Paragraph 1

Paragraph 2

Paragraph 1

Paragraph 2

  • List Item
  • List Item
  • List Item

警告: このクラスの直列化されたオブジェクトは、今後のSwingリリースと互換ではなくなる予定です。 現在の直列化のサポートは、短期間の格納や、同じバージョンのSwingを実行するアプリケーション間のRMIに適しています。 1.4では、すべてのJavaBeansの長期ストレージのサポートがjava.beansパッケージに追加されました。 XMLEncoderを参照してください。