Module  java.desktop
软件包  javax.swing.text.html

Class HTMLDocument

  • All Implemented Interfaces:
    SerializableDocumentStyledDocument


    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

    除了Document和StyledDocument提供的用于突变HTMLDocument的方法之外,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: red; }
         </style>
       </head>
       <body>
         <div id="BOX">
           <p>Paragraph 1</p>
           <p>Paragraph 2</p>
         </div>
       </body>
     </html> 

    修改HTML文档的所有方法都需要一个Element 可以使用方法getElement(Element e, Object attribute, Object value)从HTML文档中获取元素。 它以深度优先顺序返回包含具有给定值的指定属性的第一个后代元素。 例如, d.getElement(d.getDefaultRootElement(), StyleConstants.NameAttribute, HTML.Tag.P)返回第一个段落元素。

    定位元素的方便快捷方式是方法getElement(String) ; 返回一个ID属性与指定值匹配的元素。 例如, d.getElement("BOX")返回DIV元素。

    getIterator(HTML.Tag t)方法也可用于查找文档中指定的HTML标记的所有出现。

    插入元素

    可以使用方法insertAfterStartinsertBeforeEnd将元素插入任何非叶元素的现有子元素之前或之后。 例如,如果eDIV元素, d.insertAfterStart(e, "<ul><li>List Item</li></ul>")插入第一款之前的列表,并d.insertBeforeEnd(e, "<ul><li>List Item</li></ul>")插入末段后的列表。 DIV块成为新插入元素的父节点。

    可以使用方法insertBeforeStartinsertAfterEnd在任何元素之前或之后插入兄弟元素。 例如,如果eDIV元素,则d.insertBeforeStart(e, "<ul><li>List Item</li></ul>")插入列表之前的DIV元素,而d.insertAfterEnd(e, "<ul><li>List Item</li></ul>")插入列表后的DIV元素。 新插入的元素成为DIV元素的兄弟。

    更换元素

    元素及其后代可以用方法setInnerHTMLsetOuterHTML 例如,如果eDIV元素,则d.setInnerHTML(e, "<ul><li>List Item</li></ul>")将使用列表替换所有子段落,并且d.setOuterHTML(e, "<ul><li>List Item</li></ul>")替换DIV元素本身。 在后一种情况下,列表的父项是BODY元素。

    概要

    下表显示了上述各种方法的示例文档和结果。

    HTML Content of example above Example 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

    另请参见:
    Serialized Form
    • 字段详细信息

      • AdditionalComments

        public static final String AdditionalComments
        文档属性键值。 键的值将是一个字符串向量,这是在正文中没有发现的注释。
        另请参见:
        Constant Field Values
    • 构造方法详细信息

      • HTMLDocument

        public HTMLDocument​()
        使用默认缓冲区大小和默认值构建HTML文档StyleSheet 这是构造函数HTMLDocument(Content, StyleSheet)的便利方法。
      • HTMLDocument

        public HTMLDocument​(StyleSheet styles)
        构造具有默认内容存储实现和指定样式/属性存储机制的HTML文档。 这是构造函数HTMLDocument(Content, StyleSheet)的便利方法。
        参数
        styles - 风格
      • HTMLDocument

        public HTMLDocument​(AbstractDocument.Content c,
                            StyleSheet styles)
        使用给定的内容存储实现和给定的样式/属性存储机制构造一个HTML文档。
        参数
        c - 内容的容器
        styles - 风格
    • 方法详细信息

      • getReader

        public HTMLEditorKit.ParserCallback getReader​(int pos)
        在使用HTML加载文档时,将为读取器提供解析器。 这是为了返回一个HTMLDocument.HTMLReader的实例。 子类可以重新实现此方法,以便根据需要更改文档的结构。 (例如,处理自定义标签,或结构性地表示字符样式元素。)
        参数
        pos - 起始位置
        结果
        解析器使用的读取器加载文档
      • getReader

        public HTMLEditorKit.ParserCallback getReader​(int pos,
                                                      int popDepth,
                                                      int pushDepth,
                                                      HTML.Tag insertTag)
        返回解析器的读取器,用于使用HTML加载文档。 这是为了返回一个HTMLDocument.HTMLReader一个实例。 子类可以重新实现此方法,以便根据需要更改文档的结构。 (例如,处理自定义标签,或结构性地表示字符样式元素。)

        这是一个方便的方法getReader(int, int, int, HTML.Tag, TRUE)

        参数
        pos - 起始位置
        popDepth - 插入之前生成的 ElementSpec.EndTagTypes的数量
        pushDepth -数量 ElementSpec.StartTagTypes用的方向 ElementSpec.JoinNextDirection应该插入之前生成,但已经生成了结束标记后
        insertTag - 开始插入文档的第一个标签
        结果
        解析器使用的读取器加载文档
      • getBase

        public URL getBase​()
        返回相对URL的位置。 默认情况下,如果文档是从URL加载的,那将是文档的URL。 如果找到一个基本标签并且可以被解析,它将被用作基本位置。
        结果
        的基地位置
      • setBase

        public void setBase​(URL u)
        设置解析相对URL的位置。 默认情况下,如果文档是从URL加载的,那将是文档的URL。 如果找到一个基本标签并且可以被解析,它将被用作基本位置。

        这也设置的基部StyleSheetu以及文档的基础。

        参数
        u - 所需的基本URL
      • insert

        protected void insert​(int offset,
                              DefaultStyledDocument.ElementSpec[] data)
                       throws BadLocationException
        批量插入新元素。 这是元素如何在文档中创建。 解析确定需要什么结构,并将规范创建为描述编辑的一组令牌,同时使文档没有写锁。 然后可以通过读取器在突发中调用该方法以获得较短持续时间的写锁定(即,当文档实际上被改变时)。
        重写:
        insertDefaultStyledDocument
        参数
        offset - 起始偏移量
        data - 元素数据
        异常
        BadLocationException - 如果给定的位置不表示相关文档中的有效位置。
      • create

        protected void create​(DefaultStyledDocument.ElementSpec[] data)
        用给定的元素规格替换文档的内容。 如果加载在突发中完成,则在插入之前调用。 这是唯一的方法,即将文档完全加载到一个突发中。
        重写:
        createDefaultStyledDocument
        参数
        data - 文件的新内容
      • setParagraphAttributes

        public void setParagraphAttributes​(int offset,
                                           int length,
                                           AttributeSet s,
                                           boolean replace)
        设置段落的属性。

        这种方法是线程安全的,尽管大多数Swing方法都不是。 详情请见Concurrency in Swing

        Specified by:
        setParagraphAttributes在接口 StyledDocument
        重写:
        setParagraphAttributesDefaultStyledDocument
        参数
        offset - 段落的偏移量(必须至少为0)
        length - 受影响的字符数(必须至少为0)
        s - 属性
        replace - 是否替换现有属性,还是合并它们
      • getStyleSheet

        public StyleSheet getStyleSheet​()
        使用HTML文档本身指定的文档特定显示规则(CSS)获取 StyleSheet
        结果
        StyleSheet
      • getIterator

        public HTMLDocument.Iterator getIterator​(HTML.Tag t)
        获取指定的HTML标签的迭代器。 这可以用于遍历包含的一组锚点,或迭代输入元素。
        参数
        t - 请求的 HTML.Tag
        结果
        给定的HTML标签的 Iterator
        另请参见:
        HTML.Tag
      • createLeafElement

        protected Element createLeafElement​(Element parent,
                                            AttributeSet a,
                                            int p0,
                                            int p1)
        创建直接表示文本(没有任何子代)的文档叶元素。 这是为了返回一个类型为HTMLDocument.RunElement的元素。
        重写:
        createLeafElementAbstractDocument
        参数
        parent - 父元素
        a - 元素的属性
        p0 - 范围的开始(必须至少为0)
        p1 - 范围的结束(必须至少为p0)
        结果
        新元素
      • createBranchElement

        protected Element createBranchElement​(Element parent,
                                              AttributeSet a)
        创建一个可以包含其他元素的文档分支元素。 这是为了返回一个类型为HTMLDocument.BlockElement的元素。
        重写:
        createBranchElementAbstractDocument
        参数
        parent - 父元素
        a - 属性
        结果
        元素
      • setTokenThreshold

        public void setTokenThreshold​(int n)
        在尝试更新文档元素结构之前,设置要缓冲的令牌数。
        参数
        n - 要缓冲的令牌数
      • getTokenThreshold

        public int getTokenThreshold​()
        在尝试更新文档元素结构之前,获取要缓冲的令牌数。 默认值为Integer.MAX_VALUE
        结果
        要缓冲的令牌数
      • setPreservesUnknownTags

        public void setPreservesUnknownTags​(boolean preservesTags)
        确定解析器如何处理未知标签。 如果设置为true,则将未知标签放入模型中,否则丢弃。
        参数
        preservesTags - 如果未知标签应保存在模型中, preservesTags true,否则标签将被删除
        另请参见:
        HTML.Tag
      • getPreservesUnknownTags

        public boolean getPreservesUnknownTags​()
        返回解析器遇到未知标记时观察到的行为。
        结果
        如果在解析时要保留未知标签,则为true
        另请参见:
        HTML.Tag
      • processHTMLFrameHyperlinkEvent

        public void processHTMLFrameHyperlinkEvent​(HTMLFrameHyperlinkEvent e)
        由HTML框架中的文档生成的进程HyperlinkEvents HyperlinkEvent类型,正如参数所示,是HTMLFrameHyperlinkEvent 除了HyperlinkEvent包含的典型信息HyperlinkEvent ,此事件还包含与发生点击的帧(源元素)和目标名称相对应的元素。 目标名称有4个可能的值:
        • _自
        • _parent
        • _最佳
        • 一个命名框架
        如果目标是_self,则动作是更改HTML.Attribute.SRC属性的值并触发ChangedUpdate事件。

        如果目标是_parent,那么它将删除父元素,它是一个<FRAMESET>元素,并插入一个新的<FRAME>元素,并将其值HTML.Attribute.SRC属性,其值等于目标网址,然后触发RemovedUpdateInsertUpdate

        如果目标是_top,这个方法什么都不做。 在实现框架的视图时,即FrameView ,处理_top被处理。 由于_top意味着替换整个文档,所以处理它将被替换的文档之外是有意义的。

        如果目标是一个命名的框架,那么将搜索一个名称等于目标的元素的元素层次结构,其HTML.Attribute.SRC属性将被更新,并ChangedUpdate一个ChangedUpdate事件。

        参数
        e - 事件
      • setParser

        public void setParser​(HTMLEditorKit.Parser parser)
        将插入html的方法使用的解析器设置为现有文档,如setInnerHTMLsetOuterHTML

        HTMLEditorKit.createDefaultDocument将为您设置解析器。 如果您手动创建了一个HTMLDocument ,请确保并相应地设置解析器。

        参数
        parser - 用于文本插入的解析器
        从以下版本开始:
        1.3
      • getParser

        public HTMLEditorKit.Parser getParser​()
        返回将HTML插入现有文档时使用的解析器。
        结果
        解析器用于文本插入
        从以下版本开始:
        1.3
      • setInnerHTML

        public void setInnerHTML​(Element elem,
                                 String htmlText)
                          throws BadLocationException,
                                 IOException
        用指定为HTML字符串的内容替换给定元素的子元素。

        这将被视为至少两个事件,n个插入后跟一个删除。

        考虑以下结构( elem参数为粗体 )。

          <body>
               |
             <div>
              /  \
             *    <p>   <p> 

        调用setInnerHTML(elem, "<ul><li>")导致以下结构(新元素为红色 )。

          <body>
               |
             <div>
                 \
             *         <ul>
                   \
             *           <li> 

        参数elem不能是一个叶子元素,否则抛出一个IllegalArgumentException 如果elemhtmlText参数为null ,则不会更改文档。

        为了正常工作,文档必须设置一个HTMLEditorKit.Parser 如果文档是通过createDefaultDocument方法从HTMLEditorKit创建的,则将是这种情况。

        参数
        elem - 其子代被替换的分支元素
        htmlText - 要解析并分配给 elem的字符串
        异常
        IllegalArgumentException - 如果 elem是叶
        IllegalStateException - 如果尚未定义 HTMLEditorKit.Parser
        BadLocationException - 如果由于结构问题而不可能更换
        IOException - 如果发生I / O异常
        从以下版本开始:
        1.3
      • setOuterHTML

        public void setOuterHTML​(Element elem,
                                 String htmlText)
                          throws BadLocationException,
                                 IOException
        用指定为HTML字符串的内容替换父项中的给定元素。

        这将被视为至少两个事件,n个插入后跟一个删除。

        当替换叶子时,如果需要,将尝试确保存在换行符。 这可能导致插入另外的元素。 考虑一下,如果要用<img>替换包含换行符的字符元素,则会创建两个元素,一个用于图像,另一个用于换行。

        如果您尝试更换元素,您最有可能会setOuterHTML(getCharacterElement (getLength()), "blah")两个元素,例如setOuterHTML(getCharacterElement (getLength()), "blah")将导致最后两个元素,一个表示“blah”,另一个表示最终元素。

        考虑以下结构( elem参数为粗体 )。

          <body>
               |
             <div>
              /  \
             *    <p>   <p> 

        调用setOuterHTML(elem, "<ul><li>")导致以下结构(新元素为红色 )。

          <body>
              |
             <ul>
               \
             *       <li> 

        如果elemhtmlText参数为null ,则不会更改文档。

        为了正常工作,该文档必须具有HTMLEditorKit.Parser集。 如果通过createDefaultDocument方法从HTMLEditorKit创建文档,则将是这种情况。

        参数
        elem - 要替换的元素
        htmlText - 要解析并插入的字符串代替 elem
        异常
        IllegalStateException - 如果尚未设置HTMLEditorKit.Parser
        BadLocationException - 如果由于结构性问题而不可能更换
        IOException - 如果发生I / O异常
        从以下版本开始:
        1.3
      • insertAfterStart

        public void insertAfterStart​(Element elem,
                                     String htmlText)
                              throws BadLocationException,
                                     IOException
        在元素的开始处插入指定为字符串的HTML。

        考虑以下结构( elem参数为粗体 )。

          <body>
               |
             <div>
              /  \
             *    <p>   <p> 

        调用insertAfterStart(elem, "<ul><li>")导致以下结构(新元素为红色 )。

          <body>
                  |
                <div>
               /  |  \
             *    <ul> <p> <p>
             /
          <li> 

        insertBeforeStart方法不同,新元素成为指定元素的子代 ,而不是兄弟。

        参数elem不能是一个叶子元素,否则抛出一个IllegalArgumentException 如果elemhtmlText参数为null ,则不会更改文档。

        为了正常工作,文档必须有一个HTMLEditorKit.Parser集。 如果文档是通过createDefaultDocument方法从HTMLEditorKit创建的,则将是这种情况。

        参数
        elem - 分支元素作为新文本的根
        htmlText - 要解析并分配给 elem的字符串
        异常
        IllegalArgumentException - 如果 elem是叶
        IllegalStateException - 如果文档上尚未设置HTMLEditorKit.Parser
        BadLocationException - 如果由于结构问题插入是不可能的
        IOException - 如果发生I / O异常
        从以下版本开始:
        1.3
      • insertBeforeEnd

        public void insertBeforeEnd​(Element elem,
                                    String htmlText)
                             throws BadLocationException,
                                    IOException
        在元素的末尾插入指定为字符串的HTML。

        如果elem的孩子是叶子,而一个elem.getEndOffset() - 1的字符是换行符,这将插入到换行符之前,以便在换行符之后没有文本。

        考虑以下结构( elem参数为粗体 )。

          <body>
               |
             <div>
              /  \
             *    <p>   <p> 

        调用insertBeforeEnd(elem, "<ul><li>")导致以下结构(新元素为红色 )。

          <body>
                  |
                <div>
               /  |  \
             *     <p> <p> <ul>
                       \
             *               <li> 

        insertAfterEnd方法不同,新元素成为指定元素的子代 ,而不是兄弟。

        参数elem不能是一个叶元素,否则抛出一个IllegalArgumentException 如果elemhtmlText参数为null ,则不会更改文档。

        为了正常工作,文档必须有一个HTMLEditorKit.Parser集。 如果文档是通过createDefaultDocument方法从HTMLEditorKit创建的,则将是这种情况。

        参数
        elem - 要作为新文本根的元素
        htmlText - 要解析并分配给 elem的字符串
        异常
        IllegalArgumentException - 如果 elem是叶
        IllegalStateException - 如果文档上尚未设置HTMLEditorKit.Parser
        BadLocationException - 如果由于结构问题插入是不可能的
        IOException - 如果发生I / O异常
        从以下版本开始:
        1.3
      • insertBeforeStart

        public void insertBeforeStart​(Element elem,
                                      String htmlText)
                               throws BadLocationException,
                                      IOException
        在给定元素开始之前插入指定为字符串的HTML。

        考虑以下结构( elem参数为粗体 )。

          <body>
               |
             <div>
              /  \
             *    <p>   <p> 

        调用insertBeforeStart(elem, "<ul><li>")导致以下结构(新元素为红色 )。

          <body>
                 /  \
             *      <ul> <div>
               /    /  \
             *     <li> <p>  <p> 

        insertAfterStart方法不同,新元素成为指定元素的兄弟 ,而不是子元素。

        如果elemhtmlText参数为null ,则不会更改文档。

        为了正常工作,该文档必须具有HTMLEditorKit.Parser集。 如果文档是通过createDefaultDocument方法从HTMLEditorKit创建的,则将是这种情况。

        参数
        elem - 内容插入之前的元素
        htmlText - 要解析并在 elem之前插入的字符串
        异常
        IllegalStateException - 如果文档上没有设置HTMLEditorKit.Parser
        BadLocationException - 如果由于结构问题插入是不可能的
        IOException - 如果发生I / O异常
        从以下版本开始:
        1.3
      • insertAfterEnd

        public void insertAfterEnd​(Element elem,
                                   String htmlText)
                            throws BadLocationException,
                                   IOException
        在给定元素结束后插入指定为字符串的HTML。

        考虑以下结构( elem参数为粗体 )。

          <body>
               |
             <div>
              /  \
             *    <p>   <p> 

        调用insertAfterEnd(elem, "<ul><li>")导致以下结构(新元素为红色 )。

          <body>
                 /  \
             *      <div> <ul>
               / \    \
             *     <p> <p>  <li> 

        insertBeforeEnd方法不同,新元素成为指定元素的兄弟 ,而不是子元素。

        如果elemhtmlText参数为null ,则不会更改文档。

        为了正常工作,文档必须有一个HTMLEditorKit.Parser集。 如果文档是通过createDefaultDocument方法从HTMLEditorKit创建的,则将是这种情况。

        参数
        elem - 内容插入后的元素
        htmlText - elem后要解析和插入的字符串
        异常
        IllegalStateException - 如果文档上尚未设置HTMLEditorKit.Parser
        BadLocationException - 如果由于结构问题插入是不可能的
        IOException - 如果发生I / O异常
        从以下版本开始:
        1.3
      • getElement

        public Element getElement​(String id)
        返回给定id为Attribute的元素。 如果找不到该元素,则返回null 请注意,此方法适用于Attribute而不是字符标记。 在以下HTML片段中: <a id="HelloThere">属性为“id”,字符标记为“a”。 这是一个方便的方法getElement(RootElement, HTML.Attribute.id, id) 这不是线程安全的。
        参数
        id - 表示所需的字符串 Attribute
        结果
        该元素具有指定的 Attributenull如果无法找到,或 null如果 idnull
        从以下版本开始:
        1.3
        另请参见:
        HTML.Attribute
      • getElement

        public Element getElement​(Element e,
                                  Object attribute,
                                  Object value)
        返回的子元素e包含属性, attribute与价值value或者null如果一个也没有找到。 这不是线程安全的。
        参数
        e - 搜索开始的根元素
        attribute - 所需的 Attribute
        value - 指定的 Attribute
        结果
        该元素具有指定的 Attribute和指定的 valuenull如果无法找到
        从以下版本开始:
        1.3
        另请参见:
        HTML.Attribute