# 如何使用编辑器窗格和文本窗格

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html](https://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html)

两个 Swing 类支持样式文本： [`JEditorPane`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JEditorPane.html) 及其子类 [`JTextPane`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextPane.html) 。 `JEditorPane`类是 Swing 样式文本组件的基础，并提供了一种机制，您可以通过该机制添加对自定义文本格式的支持。如果您想要无样式文本，请使用[文本区域](textarea.html)。

您可以通过运行 TextSamplerDemo 来查看正在使用的编辑器窗格和文本窗格。这是`TextSamplerDemo`示例的图片。

<center>![An application that provides a sample of each Swing text component](img/53a15966ce4b1b9831354a10bee51eb4.jpg)</center>

单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) （[下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html)）运行 TextSamplerDemo。或者，要自己编译并运行示例，请参考[示例索引](../examples/components/index.html#TextSamplerDemo)。

[![Launches the TextSamplerDemo Application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TextSamplerDemoProject/TextSamplerDemo.jnlp)

`TextSamplerDemo`示例几乎没有开始演示编辑器窗格和文本窗格的功能。但是，右上角的编辑器窗格显示了一个方便易用的功能：它显示从 URL 加载的不可编辑的帮助信息。右下角的文本窗格演示了您可以轻松地将图像甚至组件直接嵌入到文本窗格中。

* * *

**Note:** 

如果您需要一个成熟的帮助系统，请查看 [javahelp](https://javaee.github.io/javahelp/) 项目。

* * *

Swing 文本 API 功能强大且非常庞大，我们可以将整本书专门用于编辑窗格和文本窗格。本节介绍了它们的功能，提供了您可能想要使用哪些功能的提示，并指出了其他信息来源。

*   [使用编辑器窗格显示 URL 中的文本](#editorpane)
*   [编辑器窗格与文本窗格](#recap)
*   [使用文本窗格的示例](#textpane)
*   [编辑器窗格和文本窗格 API](#api)
*   [使用编辑器窗格和文本窗格的示例](#eg)

您可以在不了解 Swing 文本系统的情况下完成的一项任务是显示 URL 中的文本。以下是来自 [`TextSamplerDemo.java`](../examples/components/TextSamplerDemoProject/src/components/TextSamplerDemo.java) 的代码，它创建了一个不可编辑的编辑器窗格，显示使用 HTML 标记格式化的文本。

```
JEditorPane editorPane = new JEditorPane();
editorPane.setEditable(false);
java.net.URL helpURL = TextSamplerDemo.class.getResource(
                                "TextSamplerDemoHelp.html");
if (helpURL != null) {
    try {
        editorPane.setPage(helpURL);
    } catch (IOException e) {
        System.err.println("Attempted to read a bad URL: " + helpURL);
    }
} else {
    System.err.println("Couldn't find file: TextSamplerDemoHelp.html");
}

//Put the editor pane in a scroll pane.
JScrollPane editorScrollPane = new JScrollPane(editorPane);
editorScrollPane.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
editorScrollPane.setPreferredSize(new Dimension(250, 145));
editorScrollPane.setMinimumSize(new Dimension(10, 10));

```

代码使用默认构造函数创建编辑器窗格，然后调用`setEditable(false)`，以便用户无法编辑文本。接下来，代码创建`URL`对象，并使用它调用`setPage`方法。

`setPage`方法打开 URL 指向的资源，并计算出文本的格式（示例中为 HTML）。如果文本格式已知，编​​辑器窗格将使用 URL 中找到的文本初始化自身。标准编辑器窗格可以理解纯文本，HTML 和 RTF。请注意，页面可能是异步加载的，这会使 GUI 保持响应，但这意味着在调用`setPage`返回后，您不应指望完全加载的数据。

要使用编辑器窗格和文本窗格，您需要了解文本系统，[文本组件功能](generaltext.html)中对此进行了描述。关于编辑器窗格和文本窗格的几个事实分散在该部分中。在这里，我们再次列出事实并提供更多细节。这里的信息应该可以帮助您理解编辑器窗格和文本窗格之间的区别，以及何时使用哪些窗格。

*   An editor pane or a text pane can easily be loaded with text from a URL using the `setPage` method. The `JEditorPane` class also provides constructors that let you initialize an editor pane from a URL. The `JTextPane` class has no such constructors. See [Using an Editor Pane to Display Text From a URL](#editorpane) for an example that uses this feature to load an uneditable editor pane with HTML-formatted text.

    请注意，使用`setPage`方法时，文档和编辑器工具包可能会更改。例如，如果编辑器窗格包含纯文本（默认值），并且您使用 HTML 加载它，则文档将更改为`HTMLDocument`实例，编辑器工具包将更改为`HTMLEditorKit`实例。如果您的程序使用`setPage`方法，请确保调整代码以对窗格的文档和编辑器工具包实例进行可能的更改（在新文档上重新注册文档侦听器，等等）。

*   默认情况下，编辑器窗格知道如何读取，编写和编辑纯文本，HTML 和 RTF 文本。文本窗格继承此功能，但会施加某些限制。文本窗格坚持其文档实现`StyledDocument`接口。 `HTMLDocument`和`RTFDocument`都是`StyledDocuments`，因此 HTML 和 RTF 在文本窗格中按预期工作。如果您加载带有纯文本的文本窗格，则文本窗格的文档不是您所期望的`PlainDocument`，而是`DefaultStyledDocument`。
*   要支持自定义文本格式，请实现可以读取，写入和编辑该格式文本的编辑器工具包。然后调用`registerEditorKitForContentType`方法将套件注册到`JEditorPane`类。通过以这种方式注册编辑器工具包，程序中的所有编辑器窗格和文本窗格将能够读取，写入和编辑新格式。但是，如果新编辑器工具包不是`StyledEditorKit`，则文本窗格将不支持新格式。
*   如前所述，文本窗格要求其文档实现`StyledDocument`接口。 Swing 文本包提供了此接口的默认实现`DefaultStyledDocument`，它是文本窗格默认使用的文档。文本窗格还要求其编辑器工具包是`StyledEditorKit`（或子类）的实例。请注意`StyleEditorKit`的`read`和`write`方法使用纯文本。
*   通过其样式文档和样式编辑器工具包，文本窗格为命名样式和逻辑样式提供支持。 `JTextPane`类本身包含许多方法，用于处理简单地调用其文档或编辑器工具包中的方法的样式。
*   通过`JTextPane`类中提供的 API，您可以在文本窗格中嵌入图像和组件。您也可以在编辑器窗格中嵌入图像，但只能将图像包含在 HTML 或 RTF 文件中。

以下是`TextSamplerDemo`示例中的代码，用于创建和初始化文本窗格。

```
String[] initString =
        { /* ...  fill array with initial text  ... */ };

String[] initStyles =
        { /* ...  fill array with names of styles  ... */ };

JTextPane textPane = new JTextPane();
StyledDocument doc = textPane.getStyledDocument();
addStylesToDocument(doc);

//Load the text pane with styled text.
try {
    for (int i=0; i < initString.length; i++) {
        doc.insertString(doc.getLength(), initString[i],
                         doc.getStyle(initStyles[i]));
    }
} catch (BadLocationException ble) {
    System.err.println("Couldn't insert initial text into text pane.");
}

```

简而言之，此代码将初始文本硬编码为数组，并创建并硬编码几个 _ 样式 _ - 表示不同段落和字符格式的对象 - 到另一个数组中。接下来，代码循环遍历数组，将文本插入文本窗格，并指定用于插入文本的样式。

虽然这是一个有趣的例子，简明地演示了`JTextPane`的几个特性，但“真实世界”程序不太可能以这种方式初始化文本窗格。相反，程序将使用编辑器窗格来保存文档，然后将其用于初始化文本窗格。

本节列出了一些与文本和编辑器窗格相关的 API。 [JEditorPane](https://docs.oracle.com/javase/8/docs/api/javax/swing/JEditorPane.html) 及其子类 [JTextPane](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextPane.html) 的许多最有用的方法都是从`JTextComponent`类继承而来的。您可以在[文本组件 API](textapi.html) 中找到`JTextComponent`的 API 表。另请参见 [JComponent 类](jcomponent.html)，它描述了从`JComponent`继承的 API。

<caption></caption>
| 方法或构造函数 | 描述 |
| --- | --- |
| [JEditorPane（URL）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JEditorPane.html#JEditorPane-java.net.URL-)
[JEditorPane（String）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JEditorPane.html#JEditorPane-java.lang.String-) | 创建一个加载了指定 URL 文本的编辑器窗格。 |
| [setPage（URL）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JEditorPane.html#setPage-java.net.URL-)
[setPage（String）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JEditorPane.html#setPage-java.lang.String-) | 使用指定 URL 处的文本加载编辑器窗格（或文本窗格）。 |
| [URL getPage（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JEditorPane.html#getPage--) | 获取编辑器窗格（或文本窗格）当前页面的 URL。 |

<caption></caption>
| 方法或构造函数 | 描述 |
| --- | --- |
| [JTextPane（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextPane.html#JTextPane--)
[JTextPane（StyledDocument）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextPane.html#JTextPane-javax.swing.text.StyledDocument-) | 创建文本窗格。可选参数指定文本窗格的模型。 |
| [StyledDocument getStyledDocument](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextPane.html#getStyledDocument--)
[setStyledDocument（StyledDocument）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextPane.html#setStyledDocument-javax.swing.text.StyledDocument-) | 获取或设置文本窗格的模型。 |

要开始使用文本，您可能希望运行这些程序并检查其代码以查找与您要执行的操作类似的操作。

| 例 | 在哪里描述 | 笔记 |
| :-- | :-- | :-- |
| [`TextSamplerDemo`](../examples/components/index.html#TextSamplerDemo) | [使用文本组件](text.html) | 使用每个 Swing 文本组件。 |
| [`TextComponentDemo`](../examples/components/index.html#TextComponentDemo) | [文本组件功能](generaltext.html) | 提供自定义文本窗格。说明了许多文本组件功能，例如撤消和重做，文档过滤器，文档侦听器，插入符更改侦听器以及如何将编辑操作与菜单和击键相关联。 |
| [`TreeDemo`](../examples/components/index.html#TreeDemo) | [如何使用树木](tree.html) | 使用编辑器窗格显示从 HTML 文件加载的帮助。 |

学习使用[使用 JavaFX UI 控件编辑 JavaFX 中的 HTML 文本：HTML 编辑器](https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/editor.htm)教程。