public abstract class AbstractDocument extends Object implements Document, Serializable
该类实现了文档的锁定机制。 它允许多个读者或一个作家,并且作者必须等待文档的所有观察者已经被通知之前的变化,然后再开始对文档的另一个突变。 使用render
方法获取并释放读锁。 通过使文档变异的方法获取写锁定,并在方法调用期间保持写锁定。 通知是在产生突变的线程上完成的,线程在通知期间具有对文档的完全读取访问权限,但是其他读者将被保留,直到通知完成。 该通知是一个bean事件通知,直到所有收听者都被通知为止,它不允许任何进一步的突变。
任何从该类子类化并与从BasicTextUI导出的外观实现结合使用的模型可能会被异步地安全更新,因为如果文档的类型为AbstractDocument,则由BasicTextUI对所有对View层次结构的访问进行序列AbstractDocument
。 锁定假定一个独立的线程只能从DocumentListener方法访问View层次结构,并且一次只有一个事件线程处于活动状态。
如果需要并发支持,还有以下附加的含义。 任何DocumentListener实现和任何UndoListener实现的代码路径必须是线程安全的,如果尝试从死锁中安全,则不访问组件锁。 repaint
和revalidate
方法是安全的。
AbstractDocument在文档末尾建立隐含的断点。 除此之外,您可以在最后一个字符之后放置插入符号。 因此, getLength
返回的内容比内容的长度少一个。 如果您创建自己的内容,请确保并初始化它以增加一个字符。 参考StringContent和GapContent的例子。 另一个含义是,对隐含结束字符建模的元素将具有endOffset ==(getLength()+ 1)。 例如,在DefaultStyledDocument getParagraphElement(getLength()).getEndOffset() == getLength() + 1
。
警告:此类的序列化对象与将来的Swing版本不兼容。 当前的序列化支持适用于运行相同版本的Swing的应用程序之间的短期存储或RMI。 从1.4开始,对所有JavaBeans的长期存储的支持已经添加到java.beans
包中。 请参阅XMLEncoder
。
Modifier and Type | Class and Description |
---|---|
class |
AbstractDocument.AbstractElement
实现元素的抽象部分。
|
static interface |
AbstractDocument.AttributeContext
一个可用于允许MutableAttributeSet实现使用可插拔属性压缩技术的接口。
|
class |
AbstractDocument.BranchElement
实现一个包含其他元素的复合元素。
|
static interface |
AbstractDocument.Content
用于描述可编辑的字符内容序列的界面。
|
class |
AbstractDocument.DefaultDocumentEvent
正在修改文档时存储文档更改。
|
static class |
AbstractDocument.ElementEdit
可以添加到文档事件中的ElementChange的实现。
|
class |
AbstractDocument.LeafElement
实现直接表示某种内容的元素。
|
Modifier and Type | Field and Description |
---|---|
protected static String |
BAD_LOCATION
错误信息表示错误的位置。
|
static String |
BidiElementName
用于保持单向运行的元素的名称
|
static String |
ContentElementName
用于表示内容的元素的名称
|
static String |
ElementNameAttribute
用于指定元素名称的属性的名称。
|
protected EventListenerList |
listenerList
文档的事件监听器列表。
|
static String |
ParagraphElementName
用于表示段落的元素的名称
|
static String |
SectionElementName
用于保存部分的元素名称(行/段落)。
|
StreamDescriptionProperty, TitleProperty
Modifier | Constructor and Description |
---|---|
protected |
AbstractDocument(AbstractDocument.Content data)
构造一个新的
AbstractDocument ,围绕一些指定的内容存储机制。
|
protected |
AbstractDocument(AbstractDocument.Content data, AbstractDocument.AttributeContext context)
构造一个新的
AbstractDocument ,包裹一些指定的内容存储机制。
|
Modifier and Type | Method and Description |
---|---|
void |
addDocumentListener(DocumentListener listener)
添加文档侦听器以通知任何更改。
|
void |
addUndoableEditListener(UndoableEditListener listener)
添加撤消侦听器以通知任何更改。
|
protected Element |
createBranchElement(Element parent, AttributeSet a)
创建一个可以包含其他元素的文档分支元素。
|
protected Element |
createLeafElement(Element parent, AttributeSet a, int p0, int p1)
创建文档叶元素。
|
Position |
createPosition(int offs)
返回在文档更改时跟踪更改的位置。
|
void |
dump(PrintStream out)
提供诊断转储。
|
protected void |
fireChangedUpdate(DocumentEvent e)
通知所有在此事件类型上通知有兴趣的听众。
|
protected void |
fireInsertUpdate(DocumentEvent e)
通知所有在此事件类型上通知有兴趣的听众。
|
protected void |
fireRemoveUpdate(DocumentEvent e)
通知所有在此事件类型上通知有兴趣的听众。
|
protected void |
fireUndoableEditUpdate(UndoableEditEvent e)
通知所有在此事件类型上通知有兴趣的听众。
|
int |
getAsynchronousLoadPriority()
获取异步加载优先级。
|
protected AbstractDocument.AttributeContext |
getAttributeContext()
获取管理属性的上下文。
|
Element |
getBidiRootElement()
返回此文档的双向结构的根元素。
|
protected AbstractDocument.Content |
getContent()
获取文档的内容。
|
protected Thread |
getCurrentWriter()
获取当前的书写线程,如果有的话。
|
abstract Element |
getDefaultRootElement()
返回视图应该基于的根元素,除非提供了用于将视图分配给元素结构的其他机制。
|
DocumentFilter |
getDocumentFilter()
返回
DocumentFilter 插入/删除过滤的DocumentFilter。
|
DocumentListener[] |
getDocumentListeners()
返回在此文档上注册的所有文档监听器的数组。
|
Dictionary<Object,Object> |
getDocumentProperties()
支持管理一组属性。
|
Position |
getEndPosition()
返回表示文档结尾的位置。
|
int |
getLength()
返回数据的长度。
|
<T extends EventListener> |
getListeners(类<T> listenerType)
返回
FooListener 在此文档中注册为
FooListener 的所有对象的数组。
|
abstract Element |
getParagraphElement(int pos)
获取包含给定位置的段落元素。
|
Object |
getProperty(Object key)
查找属性值的方便方法。
|
Element[] |
getRootElements()
获取定义的所有根元素。
|
Position |
getStartPosition()
返回表示文档开头的位置。
|
String |
getText(int offset, int length)
从文档中获取文本序列。
|
void |
getText(int offset, int length, Segment txt)
获取文档给定部分中包含的文本。
|
UndoableEditListener[] |
getUndoableEditListeners()
返回在此文档中注册的所有可撤销编辑监听器的数组。
|
void |
insertString(int offs, String str, AttributeSet a)
在文档中插入一些内容。
|
protected void |
insertUpdate(AbstractDocument.DefaultDocumentEvent chng, AttributeSet attr)
更新由于文本插入而导致的文档结构。
|
protected void |
postRemoveUpdate(AbstractDocument.DefaultDocumentEvent chng)
由于删除文字而更新任何文档结构。
|
void |
putProperty(Object key, Object value)
用于存储属性值的便利方法。
|
void |
readLock()
获取一个锁,从文档开始读取一些状态。
|
void |
readUnlock()
读取解锁
|
void |
remove(int offs, int len)
从文档中删除一些内容。
|
void |
removeDocumentListener(DocumentListener listener)
删除文档监听器。
|
void |
removeUndoableEditListener(UndoableEditListener listener)
删除撤消侦听器。
|
protected void |
removeUpdate(AbstractDocument.DefaultDocumentEvent chng)
由于删除文字而更新任何文档结构。
|
void |
render(Runnable r)
如果模型支持异步更新,则可以在存在货币的情况下安全地呈现模型。
|
void |
replace(int offset, int length, String text, AttributeSet attrs)
将文本区域从
offset 删除为
offset + length ,并将其替换为
text 。
|
void |
setAsynchronousLoadPriority(int p)
设置异步加载优先级。
|
void |
setDocumentFilter(DocumentFilter filter)
设置
DocumentFilter 。
|
void |
setDocumentProperties(Dictionary<Object,Object> x)
替换此文档的文档属性字典。
|
protected void |
writeLock()
获取一个锁,开始变更此锁保护的文档。
|
protected void |
writeUnlock()
释放先前通过
writeLock 获得的写锁定。
|
protected EventListenerList listenerList
protected static final String BAD_LOCATION
public static final String ParagraphElementName
public static final String ContentElementName
public static final String SectionElementName
public static final String BidiElementName
public static final String ElementNameAttribute
protected AbstractDocument(AbstractDocument.Content data)
AbstractDocument
,围绕一些指定的内容存储机制。
data
- 内容
protected AbstractDocument(AbstractDocument.Content data, AbstractDocument.AttributeContext context)
AbstractDocument
,包裹一些指定的内容存储机制。
data
- 内容
context
- 属性上下文
public Dictionary<Object,Object> getDocumentProperties()
documentProperties
字典对文档范围的属性进行注释。
null
Dictionary
setDocumentProperties(java.util.Dictionary<java.lang.Object, java.lang.Object>)
public void setDocumentProperties(Dictionary<Object,Object> x)
x
- 新词典
getDocumentProperties()
protected void fireInsertUpdate(DocumentEvent e)
e
- 事件
EventListenerList
protected void fireChangedUpdate(DocumentEvent e)
e
- 事件
EventListenerList
protected void fireRemoveUpdate(DocumentEvent e)
e
- 事件
EventListenerList
protected void fireUndoableEditUpdate(UndoableEditEvent e)
e
- 事件
EventListenerList
public <T extends EventListener> T[] getListeners(类<T> listenerType)
FooListener
的所有对象的数组。
FooListener
使用addFooListener
。
您可以使用类文字指定listenerType
参数,例如FooListener.class
。 例如,您可以使用以下代码查询文档d
的文档侦听器:
DocumentListener[] mls = (DocumentListener[])(d.getListeners(DocumentListener.class));
如果没有这样的侦听器存在,这个方法返回一个空数组。
listenerType
- 所请求的听众的类型;
此参数应指定从java.util.EventListener
下降的java.util.EventListener
FooListener
的所有对象的数组,如果未添加此类侦听器,则为空数组
ClassCastException
- 如果
listenerType
没有指定实现java.util.EventListener的类或
java.util.EventListener
getDocumentListeners()
,
getUndoableEditListeners()
public int getAsynchronousLoadPriority()
-1
如果文档不应该异步加载
public void setAsynchronousLoadPriority(int p)
p
- 新的异步加载优先级;
小于零的值表示不应该异步加载文档
public void setDocumentFilter(DocumentFilter filter)
DocumentFilter
。
DocumentFilter
通过了insert
和remove
以有条件地允许插入/删除文本。
null
值表示不会发生过滤。
filter
-在
DocumentFilter
用来约束文本
getDocumentFilter()
public DocumentFilter getDocumentFilter()
DocumentFilter
插入/删除过滤的DocumentFilter。
A null
返回值意味着不会发生过滤。
setDocumentFilter(javax.swing.text.DocumentFilter)
public void render(Runnable r)
这是为了在runnable执行期间获取读锁。 同时执行多个可执行文件,并且所有写入程序都将被阻止,同时存在活动的渲染运行时间。 如果runnable抛出异常,它的锁将被安全地释放。 没有一个永远不会退出的可运行的保护,这将有效地使文档被锁定为一生。
如果给定的runnable尝试在此实现中发生任何突变,则会发生死锁。 没有跟踪单个渲染线程来检测这种情况,但是一个子类可能会产生跟踪它们并引发错误的开销。
这种方法是线程安全的,尽管大多数Swing方法都不是。 请参阅Concurrency in Swing了解更多信息。
public int getLength()
getLength
在接口
Document
Document.getLength()
public void addDocumentListener(DocumentListener listener)
addDocumentListener
在界面
Document
listener
-
DocumentListener
加
Document.addDocumentListener(javax.swing.event.DocumentListener)
public void removeDocumentListener(DocumentListener listener)
removeDocumentListener
在界面
Document
listener
- 要删除的
DocumentListener
Document.removeDocumentListener(javax.swing.event.DocumentListener)
public DocumentListener[] getDocumentListeners()
DocumentListener
s或一个空数组,如果没有文件监听器当前注册
addDocumentListener(javax.swing.event.DocumentListener)
,
removeDocumentListener(javax.swing.event.DocumentListener)
public void addUndoableEditListener(UndoableEditListener listener)
UndoableEdit
将使适当的DocumentEvent被解雇,保持期(县)同步与模型。
addUndoableEditListener
在界面
Document
listener
- 要添加的
UndoableEditListener
Document.addUndoableEditListener(javax.swing.event.UndoableEditListener)
public void removeUndoableEditListener(UndoableEditListener listener)
removeUndoableEditListener
在界面
Document
listener
- 要删除的
UndoableEditListener
Document.removeDocumentListener(javax.swing.event.DocumentListener)
public UndoableEditListener[] getUndoableEditListeners()
UndoableEditListener
s或一个空数组,如果没有可撤销的编辑监听器当前注册
addUndoableEditListener(javax.swing.event.UndoableEditListener)
,
removeUndoableEditListener(javax.swing.event.UndoableEditListener)
public final Object getProperty(Object key)
getDocumentProperties().get(key);
getProperty
在接口
Document
key
- 非
null
属性键
null
getDocumentProperties()
public final void putProperty(Object key, Object value)
getDocumentProperties().put(key, value);
如果value
是null
这个方法将删除该属性。
putProperty
在界面
Document
key
- 非
null
键
value
- 物业价值
getDocumentProperties()
public void remove(int offs, int len) throws BadLocationException
这种方法是线程安全的,尽管大多数Swing方法都不是。 请参阅Concurrency in Swing了解更多信息。
remove
在界面
Document
offs
- 起始偏移量> = 0
len
- 要删除的字符数> = 0
BadLocationException
- 给定的删除位置不是文档中的有效位置
Document.remove(int, int)
public void replace(int offset, int length, String text, AttributeSet attrs) throws BadLocationException
offset
删除为offset + length
,并将其替换为text
。
实现如何实现,一些实现可以将其视为两个不同的操作:一个删除后跟一个插入,另一些可以将替换视为一个原子操作。
offset
- 子元素的索引
length
- 要删除的文本长度,可能为0表示不删除任何内容
text
- 要插入的文本,
null
表示没有要插入的文本
attrs
- 指示插入文本的属性的AttributeSet,
null
是合法的,通常被视为一个空的属性集,但精确的解释留给子类
BadLocationException
- 给定的位置不是文档中的有效位置
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
这种方法是线程安全的,尽管大多数Swing方法都不是。 请参阅Concurrency in Swing了解更多信息。
insertString
在接口
Document
offs
- 起始偏移量> = 0
str
- 要插入的字符串;
对空/空字符串不做任何事情
a
- 插入内容的属性
BadLocationException
- 给定的插入位置不是文档中的有效位置
Document.insertString(int, java.lang.String, javax.swing.text.AttributeSet)
public String getText(int offset, int length) throws BadLocationException
getText
在接口
Document
offset
- 起始偏移量> = 0
length
- 要检索的字符数> = 0
BadLocationException
- 给定的范围包括文档中不是有效位置的位置
Document.getText(int, int)
public void getText(int offset, int length, Segment txt) throws BadLocationException
如果txt参数的partialReturn属性为false,则在段中返回的数据将是所请求的整个长度,并且根据数据的存储方式可以复制或不复制。 如果partialReturn属性为true,则只返回无需创建副本的文本数量。 使用部分返回将会在扫描文档的大部分的情况下提供更好的性能。 以下是使用部分返回访问整个文档的示例:
int nleft = doc.getDocumentLength();
Segment text = new Segment();
int offs = 0;
text.setPartialReturn(true);
while (nleft > 0) {
doc.getText(offs, nleft, text);
// do something with text
nleft -= text.count;
offs += text.count;
}
getText
在界面
Document
offset
- 起始偏移量> = 0
length
- 要检索的字符数> = 0
txt
- 将文本检索到的Segment对象
BadLocationException
- 给定的范围包括文档中不是有效位置的位置
public Position createPosition(int offs) throws BadLocationException
这种方法是线程安全的,尽管大多数Swing方法都不是。 请参阅Concurrency in Swing了解更多信息。
createPosition
在接口
Document
offs
- 模型中的位置> = 0
BadLocationException
- 如果给定的位置不表示相关文档中的有效位置
Document.createPosition(int)
public final Position getStartPosition()
getStartPosition
在接口
Document
public final Position getEndPosition()
getEndPosition
在接口
Document
public Element[] getRootElements()
getRootElements
在界面
Document
public abstract Element getDefaultRootElement()
getDefaultRootElement
在界面
Document
Document.getDefaultRootElement()
public Element getBidiRootElement()
public abstract Element getParagraphElement(int pos)
pos
- 起始偏移量> = 0
protected final AbstractDocument.AttributeContext getAttributeContext()
protected void insertUpdate(AbstractDocument.DefaultDocumentEvent chng, AttributeSet attr)
chng
- 变更的说明
attr
- 更改的属性
protected void removeUpdate(AbstractDocument.DefaultDocumentEvent chng)
chng
- 变更的描述
protected void postRemoveUpdate(AbstractDocument.DefaultDocumentEvent chng)
chng
- 变更的说明
public void dump(PrintStream out)
out
- 输出流
protected final AbstractDocument.Content getContent()
protected Element createLeafElement(Element parent, AttributeSet a, int p0, int p1)
parent
- 父元素
a
- 元素的属性
p0
- 范围的开始> = 0
p1
- 范围的结束> = p0
protected Element createBranchElement(Element parent, AttributeSet a)
parent
- 父元素
a
- 属性
protected final Thread getCurrentWriter()
null
如果没有进行修改
protected final void writeLock()
writeLock
,只要它不会从文档通知中获得额外的writeLock
s。
试图获得一个writeLock
从通知的DocumentListener内将导致IllegalStateException
。
每个线程获得多个writeLock
的能力允许子类获取一个writeLock,执行一些操作,然后释放该锁。
呼叫writeLock
必须通过调用来平衡writeUnlock
,否则Document
将处于锁定状态留下所以没有读或写可以做到的。
IllegalStateException
- 抛出非法锁定尝试。
如果文档被正确实现,这只能在文档侦听器尝试变更文档时发生。
这种情况违反了bean事件模型,其中不能保证交付顺序,并且在允许进一步突变之前应通知所有收听者。
protected final void writeUnlock()
writeLock
获得的写锁定。
如果没有未完成的锁定,则递减锁定计数,这将允许新的作者或读者。
writeLock()
public final void readLock()
readUnlock
平衡。
readUnlock()
public final void readUnlock()
readLock(); try { // do something } finally { readUnlock(); }
readLock()