|
JavaTM 2 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 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。