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