public class JEditorPane extends JTextComponent
可編輯各種內容的文本組件。有關基礎知識信息和使用編輯器窗格的示例,請參閱 The Java Tutorial 中的 Using Text Components 一節。
此組件使用 EditorKit
的實現來完成其操作。對於給予它的各種內容,它能有效地將其形態變換為適當的文本編輯器種類。該編輯器在任意給定時間的內容類型都由當前已安裝的 EditorKit
確定。如果將內容設置為新的 URL,則使用其類型來確定加載該內容所應使用的 EditorKit
。
默認情況下,已知下列內容類型:
- text/plain
-
純文本,即無法識別給定的類型時所使用的默認值。在此情況下使用的工具包是
DefaultEditorKit
的擴展,可生成有換行的純文本視圖。 - text/html
-
HTML 文本。在此情況下使用的工具包是類
javax.swing.text.html.HTMLEditorKit
,支持 HTML 3.2。 - text/rtf
-
RTF 文本。在此情況下使用的工具包是類
javax.swing.text.rtf.RTFEditorKit
,它提供了對多樣化文本格式 (Rich Text Format) 的有限支持。
有多種方式可將內容加載到此組件中。
- 可使用
setText
方法來初始化字符串組件。在這種情況下,將使用當前的EditorKit
,且此類型為期望的內容類型。 - 可使用
read
方法來初始化Reader
組件。注意,如果內容類型為 HTML,那么只有使用了 <base> 標記,或者設置了HTMLDocument
上的 Base 屬性時才能解析相關的引用(例如對於類似圖像等內容)。在這種情況下,將使用當前的EditorKit
,且此類型為期望的內容類型。 - 可使用
setPage
方法來初始化 URL 組件。在這種情況下,將根據該 URL 來確定內容類型,並且設置為該內容類型所注冊的EditorKit
。
某些內容類型可能通過生成超鏈接事件來提供對超鏈接的支持。如果 JEditorPane
是不可編輯的(已調用了 JEditorPane.setEditable(false);
),則 HTML EditorKit
將生成超鏈接事件。如果文檔中嵌入了 HTML frame,則典型的響應是更改當前文檔的某一部分。以下代碼片段是一種可能的超鏈接偵聽器實現,它特殊對待 HTML frame 事件,並且簡單地顯示其他所有已激活的超鏈接。
class Hyperactive implements HyperlinkListener {
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
JEditorPane pane = (JEditorPane) e.getSource();
if (e instanceof HTMLFrameHyperlinkEvent) {
HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent)e;
HTMLDocument doc = (HTMLDocument)pane.getDocument();
doc.processHTMLFrameHyperlinkEvent(evt);
} else {
try {
pane.setPage(e.getURL());
} catch (Throwable t) {
t.printStackTrace();
}
}
}
}
}
有關自定義如何呈現 text/html 的信息,請參閱 W3C_LENGTH_UNITS
和 HONOR_DISPLAY_PROPERTIES
某些文檔中與文化相關的信息是通過一種稱為字符編碼的機制來處理的。字符編碼是字符集的成員(字母、象形文字、數字、符號或控制函數)和具體數字代碼值的明確映射關系。它表示了文件的存儲方式。字符編碼有 ISO-8859-1、ISO-8859-5、Shift-jis、Euc-jp 和 UTF-8。將文件傳遞給用戶代理 (JEditorPane
) 時,該文件被轉換為文檔字符集 (ISO-10646 aka Unicode)。
有多種方式可獲得使用 JEditorPane
時所用的字符集映射關系。
- 一種方式是將字符集指定為 MIME 類型的參數。通過調用 setContentType 方法來建立此方式。如果通過 setPage 方法加載內容,則其內容類型已根據 URL 的規范進行了設置。如果直接加載文件,則期望在加載前就已設置內容類型。
- 指定字符集的另一種方式是在該文檔內指定。這需要在確定所需的字符集之前讀取該文檔。要處理此情況,需要
EditorKit
.read 操作拋出將要被捕獲的ChangedCharSetException
。然后使用新的 Reader 重新開始該 read 操作,該 Reader 使用ChangedCharSetException
(這是一個IOException
)中所指定的字符集。
- 換行
- 有關如何處理換行的討論,請參閱 DefaultEditorKit。
警告: Swing 不是線程安全的。有關更多信息,請參閱 Swing's Threading Policy。
警告:此類的序列化對象與以后的 Swing 版本不兼容。當前序列化支持適用於短期存儲,或適用於在運行相同 Swing 版本的應用程序之間進行 RMI(Remote Method Invocation,遠程方法調用)。從 1.4 版本開始,已在 java.beans
包中添加了支持所有 JavaBeansTM 長期存儲的功能。請參見 XMLEncoder
。