public class HTMLDocument extends DefaultStyledDocument
HTMLDocument.HTMLReader
类HTMLDocument.HTMLReader
, HTMLEditorKit.ParserCallback
实现了解析器期望的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的构造函数来提供Content
方法。
除了Document和StyledDocument提供的用于突变HTMLDocument的方法之外,HTMLDocument还提供了一些方便的方法。 可以使用以下方法将HTML内容插入到现有文档中。
setInnerHTML(Element, String)
setOuterHTML(Element, String)
insertBeforeStart(Element, String)
insertAfterStart(Element, String)
insertBeforeEnd(Element, String)
insertAfterEnd(Element, String)
以下示例说明使用这些方法。 每个示例假定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标签的所有出现。
可以使用方法insertAfterStart
和insertBeforeEnd
将元素插入任何非叶元素的现有子元素之前或之后。 例如,如果e
是DIV
元素, d.insertAfterStart(e, "<ul><li>List Item</li></ul>")
插入d.insertAfterStart(e, "<ul><li>List Item</li></ul>")
之前的列表,并且d.insertBeforeEnd(e, "<ul><li>List Item</li></ul>")
在最后一段之后插入列表。 DIV
块成为新插入元素的父代。
通过使用方法insertBeforeStart
和insertAfterEnd
可以在任何元素之前或之后插入insertBeforeStart
insertAfterEnd
。 例如,如果e
是DIV
元素, d.insertBeforeStart(e, "<ul><li>List Item</li></ul>")
插入列表之前的DIV
元素,而d.insertAfterEnd(e, "<ul><li>List Item</li></ul>")
插入列表后的DIV
元素。 新插入的元素成为DIV
元素的兄弟。
可以使用方法setInnerHTML
和setOuterHTML
来代替setInnerHTML
及其setOuterHTML
。 例如,如果e
是DIV
元素, d.setInnerHTML(e, "<ul><li>List Item</li></ul>")
用列表替换所有的孩子段落,并且d.setOuterHTML(e, "<ul><li>List Item</li></ul>")
替换DIV
元素本身。 在后一种情况下,列表的父项是BODY
元素。
下表显示了上述各种方法的示例文档和结果。
ExampleinsertAfterStart
insertBeforeEnd
insertBeforeStart
insertAfterEnd
setInnerHTML
setOuterHTML
Paragraph 1
Paragraph 2
Paragraph 1
Paragraph 2
Paragraph 1
Paragraph 2
Paragraph 1
Paragraph 2
Paragraph 1
Paragraph 2
警告:此类的序列化对象与将来的Swing版本不兼容。 当前的序列化支持适用于运行相同版本的Swing的应用程序之间的短期存储或RMI。 从1.4开始,对所有JavaBeans的长期存储的支持已经添加到java.beans
包中。 请参阅XMLEncoder
。
Modifier and Type | Class and Description |
---|---|
class |
HTMLDocument.BlockElement
表示HTML的结构
块的元素。
|
class |
HTMLDocument.HTMLReader
HTML读取器,用于加载HTML元素结构的HTML文档。
|
static class |
HTMLDocument.Iterator
迭代器迭代特定类型的标签。
|
class |
HTMLDocument.RunElement
表示一组文本的元素,该文本块分配有一组HTML字符级属性。
|
DefaultStyledDocument.AttributeUndoableEdit, DefaultStyledDocument.ElementBuffer, DefaultStyledDocument.ElementSpec, DefaultStyledDocument.SectionElement
AbstractDocument.AbstractElement, AbstractDocument.AttributeContext, AbstractDocument.BranchElement, AbstractDocument.Content, AbstractDocument.DefaultDocumentEvent, AbstractDocument.ElementEdit, AbstractDocument.LeafElement
Modifier and Type | Field and Description |
---|---|
static String |
AdditionalComments
文档属性键值。
|
buffer, BUFFER_SIZE_DEFAULT
BAD_LOCATION, BidiElementName, ContentElementName, ElementNameAttribute, listenerList, ParagraphElementName, SectionElementName
StreamDescriptionProperty, TitleProperty
Constructor and Description |
---|
HTMLDocument()
使用默认缓冲区大小和默认值
StyleSheet 构造一个HTML文档。
|
HTMLDocument(AbstractDocument.Content c, StyleSheet styles)
使用给定的内容存储实现和给定的样式/属性存储机制构造一个HTML文档。
|
HTMLDocument(StyleSheet styles)
构造具有默认内容存储实现和指定样式/属性存储机制的HTML文档。
|
Modifier and Type | Method and Description |
---|---|
protected void |
create(DefaultStyledDocument.ElementSpec[] data)
用给定的元素规格替换文档的内容。
|
protected Element |
createBranchElement(Element parent, AttributeSet a)
创建一个可以包含其他元素的文档分支元素。
|
protected AbstractDocument.AbstractElement |
createDefaultRoot()
创建用于表示默认文档结构的根元素。
|
protected Element |
createLeafElement(Element parent, AttributeSet a, int p0, int p1)
创建直接表示文本(没有任何子代)的文档叶元素。
|
protected void |
fireChangedUpdate(DocumentEvent e)
通知所有在此事件类型上通知有兴趣的听众。
|
protected void |
fireUndoableEditUpdate(UndoableEditEvent e)
通知所有在此事件类型上通知有兴趣的听众。
|
URL |
getBase()
返回相对URL的位置。
|
Element |
getElement(Element e, Object attribute, Object value)
返回的子元素
e 包含属性,
attribute 值为
value ,或
null ,如果一个也没有找到。
|
Element |
getElement(String id)
返回给定ID为
Attribute 的元素。
|
HTMLDocument.Iterator |
getIterator(HTML.Tag t)
获取指定的HTML标签的迭代器。
|
HTMLEditorKit.Parser |
getParser()
返回在将HTML插入现有文档时使用的解析器。
|
boolean |
getPreservesUnknownTags()
返回解析器遇到未知标记时观察到的行为。
|
HTMLEditorKit.ParserCallback |
getReader(int pos)
在使用HTML加载文档时,将为读取器提供解析器。
|
HTMLEditorKit.ParserCallback |
getReader(int pos, int popDepth, int pushDepth, HTML.Tag insertTag)
返回解析器的读取器,用于使用HTML加载文档。
|
StyleSheet |
getStyleSheet()
使用HTML文档本身指定的文档特定显示规则(CSS)获取
StyleSheet 。
|
int |
getTokenThreshold()
在尝试更新文档元素结构之前,获取要缓冲的令牌数。
|
protected void |
insert(int offset, DefaultStyledDocument.ElementSpec[] data)
批量插入新元素。
|
void |
insertAfterEnd(Element elem, String htmlText)
在给定元素的末尾之后插入指定为字符串的HTML。
|
void |
insertAfterStart(Element elem, String htmlText)
在元素的开始处插入指定为字符串的HTML。
|
void |
insertBeforeEnd(Element elem, String htmlText)
在元素的末尾插入指定为字符串的HTML。
|
void |
insertBeforeStart(Element elem, String htmlText)
在给定元素开始之前插入指定为字符串的HTML。
|
protected void |
insertUpdate(AbstractDocument.DefaultDocumentEvent chng, AttributeSet attr)
更新由于文本插入而导致的文档结构。
|
void |
processHTMLFrameHyperlinkEvent(HTMLFrameHyperlinkEvent e)
处理
HyperlinkEvents 由在HTML文档的帧生成。
|
void |
setBase(URL u)
设置解析相对URL的位置。
|
void |
setInnerHTML(Element elem, String htmlText)
用指定为HTML字符串的内容替换给定元素的子元素。
|
void |
setOuterHTML(Element elem, String htmlText)
用指定为HTML字符串的内容替换父项中的给定元素。
|
void |
setParagraphAttributes(int offset, int length, AttributeSet s, boolean replace)
设置段落的属性。
|
void |
setParser(HTMLEditorKit.Parser parser)
将插入html的方法使用的解析器设置为现有文档,例如
setInnerHTML 和
setOuterHTML 。
|
void |
setPreservesUnknownTags(boolean preservesTags)
确定解析器如何处理未知标签。
|
void |
setTokenThreshold(int n)
在尝试更新文档元素结构之前,设置要缓冲的令牌数。
|
addDocumentListener, addStyle, getBackground, getCharacterElement, getDefaultRootElement, getFont, getForeground, getLogicalStyle, getParagraphElement, getStyle, getStyleNames, removeDocumentListener, removeElement, removeStyle, removeUpdate, setCharacterAttributes, setLogicalStyle, styleChanged
addUndoableEditListener, createPosition, dump, fireInsertUpdate, fireRemoveUpdate, getAsynchronousLoadPriority, getAttributeContext, getBidiRootElement, getContent, getCurrentWriter, getDocumentFilter, getDocumentListeners, getDocumentProperties, getEndPosition, getLength, getListeners, getProperty, getRootElements, getStartPosition, getText, getText, getUndoableEditListeners, insertString, postRemoveUpdate, putProperty, readLock, readUnlock, remove, removeUndoableEditListener, render, replace, setAsynchronousLoadPriority, setDocumentFilter, setDocumentProperties, writeLock, writeUnlock
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
addUndoableEditListener, createPosition, getEndPosition, getLength, getProperty, getRootElements, getStartPosition, getText, getText, insertString, putProperty, remove, removeUndoableEditListener, render
public static final String AdditionalComments
public HTMLDocument()
StyleSheet
构造一个HTML文档。
这是构造一个便捷方法HTMLDocument(Content, StyleSheet)
。
public HTMLDocument(StyleSheet styles)
HTMLDocument(Content, StyleSheet)
。
styles
- 风格
public HTMLDocument(AbstractDocument.Content c, StyleSheet styles)
c
- 内容的容器
styles
- 风格
public HTMLEditorKit.ParserCallback getReader(int pos)
HTMLDocument.HTMLReader
的实例。
子类可以重新实现此方法,以便根据需要更改文档的结构。
(例如,处理自定义标签,或结构性地表示字符样式元素。)
pos
- 起始位置
public HTMLEditorKit.ParserCallback getReader(int pos, int popDepth, int pushDepth, HTML.Tag insertTag)
HTMLDocument.HTMLReader
的实例。
子类可以重新实现此方法,以便根据需要更改文档的结构。
(例如,处理自定义标签,或结构性地表示字符样式元素。)
这是一个方便的方法getReader(int, int, int, HTML.Tag, TRUE)
。
popDepth
-数量
ElementSpec.EndTagTypes
在插入之前产生
pushDepth
-
pushDepth
的号码,
ElementSpec.StartTagTypes
为
ElementSpec.JoinNextDirection
,应在插入前生成,但在生成结束标签后
insertTag
- 开始插入文档的第一个标签
public URL getBase()
public void setBase(URL u)
这也将StyleSheet
设置为u
以及文档的基数。
u
- 所需的基本URL
protected void insert(int offset, DefaultStyledDocument.ElementSpec[] data) throws BadLocationException
insert
在
DefaultStyledDocument
offset
- 起始偏移量
data
- 元素数据
BadLocationException
- 如果给定的位置不表示相关文档中的有效位置。
protected void insertUpdate(AbstractDocument.DefaultDocumentEvent chng, AttributeSet attr)
insertUpdate
在
DefaultStyledDocument
chng
- 文件更改的说明
attr
- 属性
protected void create(DefaultStyledDocument.ElementSpec[] data)
create
在类
DefaultStyledDocument
data
- 文件的新内容
public void setParagraphAttributes(int offset, int length, AttributeSet s, boolean replace)
这种方法是线程安全的,尽管大多数Swing方法都不是。 请参阅Concurrency in Swing了解更多信息。
setParagraphAttributes
在接口
StyledDocument
setParagraphAttributes
在
DefaultStyledDocument
offset
-
offset
的偏移量(必须至少为0)
length
- 受影响的字符数(必须至少为0)
s
- 属性
replace
- 是否替换现有属性,或合并它们
public StyleSheet getStyleSheet()
StyleSheet
。
StyleSheet
public HTMLDocument.Iterator getIterator(HTML.Tag t)
t
- 请求
HTML.Tag
Iterator
HTML.Tag
protected Element createLeafElement(Element parent, AttributeSet a, int p0, int p1)
HTMLDocument.RunElement
。
createLeafElement
在类
AbstractDocument
parent
- 父元素
a
- 元素的属性
p0
- 范围的开始(必须至少为0)
p1
- 范围的结束(必须至少为p0)
protected Element createBranchElement(Element parent, AttributeSet a)
HTMLDocument.BlockElement
。
createBranchElement
在
AbstractDocument
parent
- 父元素
a
- 属性
protected AbstractDocument.AbstractElement createDefaultRoot()
createDefaultRoot
在
DefaultStyledDocument
public void setTokenThreshold(int n)
n
- 要缓冲的令牌数
public int getTokenThreshold()
Integer.MAX_VALUE
。
public void setPreservesUnknownTags(boolean preservesTags)
preservesTags
- 如果未知标签应保存在模型中,则为true,否则标签将被删除
HTML.Tag
public boolean getPreservesUnknownTags()
HTML.Tag
public void processHTMLFrameHyperlinkEvent(HTMLFrameHyperlinkEvent e)
HyperlinkEvents
由在HTML文档的帧生成。
HyperlinkEvent
类型,如参数所示,是HTMLFrameHyperlinkEvent
。
除了包含在典型的信息HyperlinkEvent
,这个事件包含对应于其中的点击发生的帧(源元件)和目标名称的元素。
目标名称有4个可能的值:
HTML.Attribute.SRC
属性的值并触发ChangedUpdate
事件。
如果目标是_parent,那么它将删除父元素,它是一个<FRAMESET>元素,并插入一个新的<FRAME>元素,并将其HTML.Attribute.SRC
属性设置为具有等于目的地URL的值,然后触发RemovedUpdate
和InsertUpdate
。
如果目标是_top,这个方法什么都不做。 在执行一个框架的视图,即FrameView
,处理_top被处理。 鉴于_top意味着替换整个文档,在文档的外部处理它将被替换是有意义的。
如果目标是一个命名的框架,那么元素层次结构将搜索一个名称等于目标的元素,它的HTML.Attribute.SRC
属性被更新,并且一个ChangedUpdate
事件被触发。
e
- 事件
public void setParser(HTMLEditorKit.Parser parser)
setInnerHTML
和setOuterHTML
。
HTMLEditorKit.createDefaultDocument
将为您设置解析器。 如果您手动创建了一个HTMLDocument
,请确保并相应地设置解析器。
parser
- 用于文本插入的解析器
public HTMLEditorKit.Parser getParser()
public void setInnerHTML(Element elem, String htmlText) throws BadLocationException, IOException
这将被视为至少两个事件,n个插入后跟一个删除。
考虑以下结构( elem
参数为粗体 )。
<body>
|
<div>
/ \
<p> <p>
调用setInnerHTML(elem, "<ul><li>")
导致以下结构(新元素为红色 )。
<body>
|
<div>
\
<ul>
\
<li>
参数elem
不能是叶元素,否则抛出IllegalArgumentException
。 如果elem
或htmlText
参数为null
,则不会更改文档。
为了正常工作,文档必须有一个HTMLEditorKit.Parser
集。 如果文档是通过createDefaultDocument
方法从HTMLEditorKit创建的,则将是这种情况。
elem
- 其子代被替换的分支元素
htmlText
- 要解析并分配给
elem
IllegalArgumentException
- 如果
elem
是叶
IllegalStateException
- 如果尚未定义
HTMLEditorKit.Parser
BadLocationException
IOException
public void setOuterHTML(Element elem, String htmlText) throws BadLocationException, IOException
这将被视为至少两个事件,n个插入后跟一个删除。
当替换叶子时,如果需要,将尝试确保存在换行符。 这可能导致插入另外的元素。 考虑一下,如果要用<img>替换包含换行符的字符元素,则会创建两个元素,一个用于图像,另一个用于换行。
如果您尝试更换元素,您最有可能会setOuterHTML(getCharacterElement (getLength()), "blah")
两个元素,例如setOuterHTML(getCharacterElement (getLength()), "blah")
会导致最后两个元素,一个表示“blah”,另一个表示最终元素。
考虑以下结构( elem
参数以粗体显示 )。
<body>
|
<div>
/ \
<p> <p>
调用setOuterHTML(elem, "<ul><li>")
导致以下结构(新元素为红色 )。
<body>
|
<ul>
\
<li>
如果elem
或htmlText
参数为null
,则不会更改文档。
为了正常工作,该文档必须具有HTMLEditorKit.Parser集。 如果文档是通过createDefaultDocument
方法从HTMLEditorKit创建的,则将是这种情况。
elem
- 要替换的元素
htmlText
- 要解析和插入的字符串代替
elem
IllegalStateException
- 如果尚未设置HTMLEditorKit.Parser
BadLocationException
IOException
public void insertAfterStart(Element elem, String htmlText) throws BadLocationException, IOException
考虑以下结构( elem
参数为粗体 )。
<body>
|
<div>
/ \
<p> <p>
调用insertAfterStart(elem, "<ul><li>")
导致以下结构(新元素为红色 )。
<body>
|
<div>
/ | \
<ul> <p> <p>
/
<li>
不像insertBeforeStart
方法,新的元素成为指定元素的孩子 ,不是同级。
参数elem
不能是叶元素,否则抛出IllegalArgumentException
。 如果elem
或htmlText
参数为null
,则不会更改文档。
为了正常工作,文档必须有一个HTMLEditorKit.Parser
集。 如果文档是通过createDefaultDocument
方法从HTMLEditorKit创建的,则将是这种情况。
elem
- 作为新文本根的分支元素
htmlText
- 要解析并分配给
elem
IllegalArgumentException
- 如果
elem
是一个叶子
IllegalStateException
- 如果文档上尚未设置HTMLEditorKit.Parser
BadLocationException
IOException
public void insertBeforeEnd(Element elem, String htmlText) throws BadLocationException, IOException
如果elem
的孩子是叶子,而一个elem.getEndOffset() - 1
的字符是一个换行符,这将插入到换行符之前,以便在换行符之后没有文本。
考虑以下结构( elem
参数为粗体 )。
<body>
|
<div>
/ \
<p> <p>
调用insertBeforeEnd(elem, "<ul><li>")
导致以下结构(新元素为红色 )。
<body>
|
<div>
/ | \
<p> <p> <ul>
\
<li>
不像insertAfterEnd
方法,新的元素成为指定元素的孩子 ,不是同级。
参数elem
不能是叶元素,否则抛出IllegalArgumentException
。 如果elem
或htmlText
参数为null
,则不会更改文档。
为了使其正常工作,文档必须设置一个HTMLEditorKit.Parser
。 如果文档是通过createDefaultDocument
方法从HTMLEditorKit创建的,则将是这种情况。
elem
- 要作为新文本根的元素
htmlText
- 要解析并分配给
elem
IllegalArgumentException
- 如果
elem
是叶
IllegalStateException
- 如果文档上没有设置HTMLEditorKit.Parser
BadLocationException
IOException
public void insertBeforeStart(Element elem, String htmlText) throws BadLocationException, IOException
考虑以下结构( elem
参数是粗体 )。
<body>
|
<div>
/ \
<p> <p>
调用insertBeforeStart(elem, "<ul><li>")
导致以下结构(新元素为红色 )。
<body>
/ \
<ul> <div>
/ / \
<li> <p> <p>
与insertAfterStart
方法不同,新元素成为指定元素的兄弟 ,而不是子元素。
如果elem
或htmlText
参数为null
,则不会更改文档。
为了正常工作,文档必须有一个HTMLEditorKit.Parser
集。 如果文档是通过createDefaultDocument
方法从HTMLEditorKit创建的,则将是这种情况。
elem
- 内容插入之前的元素
htmlText
- 要在
elem
之前解析和插入的字符串
IllegalStateException
- 如果文档上尚未设置HTMLEditorKit.Parser
BadLocationException
IOException
public void insertAfterEnd(Element elem, String htmlText) throws BadLocationException, IOException
考虑以下结构( elem
参数为粗体 )。
<body>
|
<div>
/ \
<p> <p>
调用insertAfterEnd(elem, "<ul><li>")
导致以下结构(新元素为红色 )。
<body>
/ \
<div> <ul>
/ \ \
<p> <p> <li>
与insertBeforeEnd
方法不同,新元素成为指定元素的兄弟 ,而不是子元素。
如果elem
或htmlText
参数为null
,则不会更改文档。
为了正常工作,文档必须有一个HTMLEditorKit.Parser
集。 如果文档是通过createDefaultDocument
方法从HTMLEditorKit创建的,则将是这种情况。
elem
- 内容插入后的元素
htmlText
- 要解析并在
elem
之后插入的字符串
IllegalStateException
- 如果文档上尚未设置HTMLEditorKit.Parser
BadLocationException
IOException
public Element getElement(String id)
Attribute
的元素。
如果找不到元素,则返回null
。
请注意,此方法适用于Attribute
, 而不是字符标记。
在以下HTML片段中: <a id="HelloThere">
属性为“id”,字符标记为“a”。
这是一个方便的方法getElement(RootElement, HTML.Attribute.id, id)
。
这不是线程安全的。
id
- 表示所需
Attribute
的字符串
Attribute
或
null
如果无法找到,或
null
如果
id
是
null
HTML.Attribute
public Element getElement(Element e, Object attribute, Object value)
e
包含属性, attribute
值为value
,或null
,如果一个也没有找到。
这不是线程安全的。
e
- 搜索开始的根元素
attribute
- 所需的
Attribute
value
-指定的值
Attribute
Attribute
和指定的
value
,或
null
如果无法找到
HTML.Attribute
protected void fireChangedUpdate(DocumentEvent e)
fireChangedUpdate
在
AbstractDocument
e
- 事件
EventListenerList
protected void fireUndoableEditUpdate(UndoableEditEvent e)
fireUndoableEditUpdate
在
AbstractDocument
类
e
- 事件
EventListenerList