|
JavaTM Platform Standard Ed. 6 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.lang.Object javax.swing.text.AbstractDocument
public abstract class AbstractDocument
文档接口的实现,可作为实现各种文档的基础。在此级别上几乎没有策略,所以相应地增加了使用难度。
此类实现了文档的锁定机制。它允许多个 reader 或一个 writer,并且在 writer 开始对文档的另一次改变前,必须等到将以前的更改已通知该文档的所有观察者。使用 render
方法获取和释放读取锁定。通过改变文档的那些方法来获取写入锁定,并且在该方法调用期间保持锁定。在生成改变的线程上完成通知,并且在通知期间该线程对文件具有完全的读取访问权限,不过在通知结束前其他 reader 无法读取。该通知是一个 bean 事件通知,只有通知所有侦听器之后才允许进一步的改变。
所有根据此类创建子类且与文本组件(该组件具有派生自 BasicTextUI 的外观实现)一起使用的模型都可安全地进行异步更新,因为如果该文档的类型是 AbstractDocument
,则对 View 层次结构的所有访问都是由 BasicTextUI 序列化的。锁定机制假定独立的线程仅从 DocumentListener 方法访问 View 层次结构,并且同一时间只有一个事件线程处于活动状态。
如果需要并发支持,则有下列额外的含义。所有 DocumentListener 实现和所有 UndoListener 实现的代码路径必须是线程安全的,并且如果要避免死锁,则不能访问组件锁定。在 JComponent 上执行 repaint
和 revalidate
方法是安全的。
AbstractDocument 在文档的结尾模拟了一个隐含的分隔。除了其他作用,这一功能允许您在最后一个字符的后面定位插入符。因此,getLength
返回一个比 Content 的长度小的值。如果创建自己的 Content,一定要有一个额外的字符并且初始化它。有关此内容的示例,请参见 StringContent 和 GapContent。另一个含义是模拟该隐含结束字符的 Element 具有 endOffset == (getLength() + 1)。例如,在 DefaultStyledDocument 中,getParagraphElement(getLength()).getEndOffset() == getLength() + 1
。
警告:此类的已序列化对象与以后的 Swing 版本不兼容。当前的序列化支持适用于短期存储或运行相同 Swing 版本的应用程序之间的 RMI。从 1.4 版本开始,已在 java.beans
包中添加了支持所有 JavaBeansTM 长期存储的功能。请参见 XMLEncoder
。
嵌套类摘要 | |
---|---|
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
实现可直接表示某类内容的元素。 |
字段摘要 | |
---|---|
protected static String |
BAD_LOCATION
指示位置错误的错误消息。 |
static String |
BidiElementName
用于保存单向操作的元素名。 |
static String |
ContentElementName
用于表示内容的元素名 |
static String |
ElementNameAttribute
用于指定元素名的属性名。 |
protected EventListenerList |
listenerList
文档的事件侦听器列表。 |
static String |
ParagraphElementName
用于表示段落的元素名 |
static String |
SectionElementName
用于保存各节(行/段落)的元素名。 |
从接口 javax.swing.text.Document 继承的字段 |
---|
StreamDescriptionProperty, TitleProperty |
构造方法摘要 | |
---|---|
protected |
AbstractDocument(AbstractDocument.Content data)
构造具有某种指定内容存储机制的新 AbstractDocument 。 |
protected |
AbstractDocument(AbstractDocument.Content data,
AbstractDocument.AttributeContext context)
构造具有某种指定内容存储机制的新 AbstractDocument 。 |
方法摘要 | ||
---|---|---|
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)
提供诊断转储 (dump)。 |
|
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()
返回数据的长度。 |
|
|
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 所获得的写入锁定。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
字段详细信息 |
---|
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)
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(Class<T> listenerType)
FooListener
的所有对象组成的数组。FooListener
是用 addFooListener
方法注册的。
可以使用 class 字面值来指定 listenerType
参数,如 FooListener.class
。例如,可以使用以下代码查询文档 d
,以获得该文档的侦听器:
DocumentListener[] mls = (DocumentListener[])(d.getListeners(DocumentListener.class));如果不存在这样的侦听器,则此方法将返回一个空数组。
listenerType
- 所请求的侦听器类型;此参数应该指定一个从 java.util.EventListener
继承的接口
FooListener
注册的所有对象的数组,如果尚未添加这样的侦听器,则返回一个空数组
ClassCastException
- 如果 listenerType
未指定一个实现 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
。null
返回值意味着不进行过滤。
setDocumentFilter(javax.swing.text.DocumentFilter)
public void render(Runnable r)
实现此方法以便为 runnable 执行期间获取一个读取锁定。在同一时间,可能有多个 runnable 在执行,并且当存在活动呈现的 runnable 时将会阻塞所有 writer。如果该 runnable 抛出异常,则将安全地释放其锁定。对于从不退出的 runnable 没有保护,在其生命周期中会有效地保持文档的锁定。
如果给定的 runnable 试图在此实现中对文档进行任何改变,则会发生死锁。没有为每个呈现线程进行跟踪以便允许检测此种情况的机制,但是子类可以通过额外的开销对呈现线程进行跟踪,并在死锁时抛出错误。
虽然大多数 Swing 方法不是线程安全的,但此方法是线程安全的。有关更多信息,请参阅 How to Use Threads。
Document
中的 render
r
- 要执行的渲染器public int getLength()
Document
中的 getLength
Document.getLength()
public void addDocumentListener(DocumentListener listener)
Document
中的 addDocumentListener
listener
- 要添加的 DocumentListener
Document.addDocumentListener(javax.swing.event.DocumentListener)
public void removeDocumentListener(DocumentListener listener)
Document
中的 removeDocumentListener
listener
- 要移除的 DocumentListener
Document.removeDocumentListener(javax.swing.event.DocumentListener)
public DocumentListener[] getDocumentListeners()
DocumentListener
,如果当前没有注册的文档侦听器,则返回一个空数组addDocumentListener(javax.swing.event.DocumentListener)
,
removeDocumentListener(javax.swing.event.DocumentListener)
public void addUndoableEditListener(UndoableEditListener listener)
UndoableEdit
上执行撤消/重复操作将激发适当的 DocumentEvent,以让视图与模型保持同步。
Document
中的 addUndoableEditListener
listener
- 要添加的 UndoableEditListener
Document.addUndoableEditListener(javax.swing.event.UndoableEditListener)
public void removeUndoableEditListener(UndoableEditListener listener)
Document
中的 removeUndoableEditListener
listener
- 要移除的 UndoableEditListener
Document.removeDocumentListener(javax.swing.event.DocumentListener)
public UndoableEditListener[] getUndoableEditListeners()
UndoableEditListener
,如果当前没有注册的可撤消编辑侦听器,则返回一个空数组。addUndoableEditListener(javax.swing.event.UndoableEditListener)
,
removeUndoableEditListener(javax.swing.event.UndoableEditListener)
public final Object getProperty(Object key)
getDocumentProperties().get(key);
Document
中的 getProperty
key
- 非 null
的属性键
null
getDocumentProperties()
public final void putProperty(Object key, Object value)
getDocumentProperties().put(key, value);如果
value
为 null
,则此方法将移除该属性。
Document
中的 putProperty
key
- 非 null
的键value
- 属性值getDocumentProperties()
public void remove(int offs, int len) throws BadLocationException
虽然大多数 Swing 方法不是线程安全的,但此方法是线程安全的。有关更多信息,请参阅 How to Use Threads。
Document
中的 remove
offs
- 起始偏移量,该值 >= 0len
- 要移除的字符数,该值 >= 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
是合法值,通常作为空 attributeset 对待,但是具体的解释由子类负责
BadLocationException
- 给定的位置不是文档内的有效位置public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
虽然大多数 Swing 方法不是线程安全的,但此方法是线程安全的。有关更多信息,请参阅 How to Use Threads。
Document
中的 insertString
offs
- 起始偏移量,该值 >= 0str
- 要插入的字符串;null/空字符串不执行任何操作a
- 插入内容的属性
BadLocationException
- 如果给定的插入位置不是文档中的有效位置Document.insertString(int, java.lang.String, javax.swing.text.AttributeSet)
public String getText(int offset, int length) throws BadLocationException
Document
中的 getText
offset
- 起始偏移量,该值 >= 0length
- 要检索的字符数,该值 >= 0
BadLocationException
- 给定范围内包括的位置不是文档内的有效位置Document.getText(int, int)
public void getText(int offset, int length, Segment txt) throws BadLocationException
如果 txt 参数的 partialReturn 属性为 false,Segment 中返回的数据将是请求的整个长度,根据数据存储的方式可能是副本,也可能不是。如果 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; }
Document
中的 getText
offset
- 起始偏移量,该值 >= 0length
- 要检索的字符数,该值 >= 0txt
- 所检索到的文本被放入的 Segment 对象
BadLocationException
- 给定范围内包括的位置不是文档内的有效位置public Position createPosition(int offs) throws BadLocationException
虽然大多数 Swing 方法不是线程安全的,但此方法是线程安全的。有关更多信息,请参阅 How to Use Threads。
Document
中的 createPosition
offs
- 模型中的位置,该值 >= 0
BadLocationException
- 如果给定的位置不表示关联文档内的有效位置Document.createPosition(int)
public final Position getStartPosition()
Document
中的 getStartPosition
public final Position getEndPosition()
Document
中的 getEndPosition
public Element[] getRootElements()
Document
中的 getRootElements
public abstract Element getDefaultRootElement()
Document
中的 getDefaultRootElement
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
- 范围的开始,该值 >= 0p1
- 范围的结尾,该值 >= p0
protected Element createBranchElement(Element parent, AttributeSet a)
parent
- 父元素a
- 属性
protected final Thread getCurrentWriter()
null
protected final void writeLock()
writeLock
,就允许它获得多个 writeLock
。尝试从 DocumentListener 通知内获得 writeLock
将导致 IllegalStateException
。每个线程可获得多个 writeLock
的功能允许子类获得一个 writeLock、执行多个操作,然后释放该锁定。
对 writeLock
的调用必须与对 writeUnlock
的调用对称,否则 Document
将被保持在锁定状态,从而无法进行读取或写入。
IllegalStateException
- 如果尝试非法锁定。如果正确实现了文档,则仅在文档侦听器尝试改变该文档时才出现此异常。此情况违反了 bean 事件模型,此模型中不保证传递顺序,在允许进一步改变前应通知所有侦听器。protected final void writeUnlock()
writeLock
所获得的写入锁定。将锁定计数减一后,如果没有其他未解锁的锁定,则允许新的 writer 或多个 reader 执行操作。
writeLock()
public final void readLock()
readUnlock
保持对称。
readUnlock()
public final void readUnlock()
readLock();
try {
// do something
} finally {
readUnlock();
}
readLock()
|
JavaTM Platform Standard Ed. 6 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
版权所有 2007 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策。