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

两个 Swing 类支持样式文本:JEditorPane及其子类JTextPaneJEditorPane类是 Swing 样式文本组件的基础,并提供了一种机制,您可以通过该机制添加对自定义文本格式的支持。如果要使用无样式的文本,请改用text area

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

一个提供每个 Swing 文本组件 samples 的应用程序

单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 TextSamplerDemo。另外,要自己编译和运行示例,请查阅example index

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

Note:

如果您需要完善的帮助系统,请查看javahelp项目。

Swing 文本 API 强大而庞大,我们可以将整本书专门用于使用编辑器窗格和文本窗格。本节介绍其功能,提供有关您可能要使用的功能的提示,并指向其他信息来源。

使用编辑器窗格显示 URL 中的文本

在不了解 Swing 文本系统的情况下可以完成的一项任务是显示 URL 中的文本。以下是来自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的调用返回后完全加载的数据。

编辑器窗格与文本窗格

为了使用编辑器窗格和文本窗格,您需要了解文本系统,这在Literals 组件功能中进行了描述。有关编辑器窗格和文本窗格的一些事实散布在该部分中。在这里,我们再次列出事实,并提供更多细节。此处的信息应帮助您了解编辑器窗格和文本窗格之间的区别,以及何时使用它们。

  • 使用setPage方法可以轻松地从 URL 加载编辑器窗格或文本窗格。 JEditorPane类还提供了构造函数,使您可以从 URL 初始化编辑器窗格。 JTextPane类没有此类构造函数。有关使用此功能加载 HTML 格式的文本的不可编辑的编辑器窗格的示例,请参见使用编辑器窗格显示 URL 中的文本

请注意,使用setPage方法时,文档和编辑器工具包可能会更改。例如,如果一个编辑器窗格包含纯文本(默认值),并且使用 HTML 加载了该文本,则文档将更改为HTMLDocument实例,而编辑器工具包将更改为HTMLEditorKit实例。如果您的程序使用setPage方法,请确保调整代码以对窗格的文档和编辑器工具包实例进行可能的更改(在新文档上重新注册文档侦听器,依此类推)。

  • 默认情况下,编辑器窗格知道如何读取,写入和编辑纯文本,HTML 和 RTF 文本。文本窗格继承了此功能,但施加了某些限制。文本窗格坚持要求其文档实现StyledDocumentinterface。 HTMLDocumentRTFDocument均为StyledDocuments,因此 HTML 和 RTF 在文本窗格中可以正常工作。但是,如果使用纯文本加载文本窗格,则文本窗格的文档不是您可能期望的PlainDocument,而是DefaultStyledDocument

  • 要支持自定义文本格式,请实现一个可读取,写入和编辑该格式文本的编辑器套件。然后调用registerEditorKitForContentType方法向JEditorPane类注册您的工具包。通过以这种方式注册编辑器套件,程序中的所有编辑器窗格和文本窗格将能够读取,写入和编辑新格式。但是,如果新的编辑器工具包不是StyledEditorKit,则文本窗格将不支持新格式。

  • 如前所述,文本窗格需要其文档来实现StyledDocumentinterface。 Swing 文本包提供此interface的默认实现DefaultStyledDocument,这是文本窗格默认使用的文档。文本窗格还要求其编辑器工具包是StyledEditorKit(或子类)的实例。请注意,StyleEditorKitreadwrite方法使用纯文本。

  • 通过其样式文档和样式编辑器工具包,文本窗格为命名样式和逻辑样式提供了支持。 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.");
}

简而言之,此代码将初始文本硬编码为一个数组,然后将几种* style *(代表不同段落和字符格式的对象)创建并硬编码为另一个数组。接下来,代码循环遍历数组,将文本插入文本窗格,并指定用于插入的文本的样式。

尽管这是一个有趣的示例,简洁地演示了JTextPane的几个功能,但是“现实世界”程序不太可能以这种方式初始化文本窗格。相反,程序将使用编辑器窗格来保存文档,然后将其用于初始化文本窗格。

编辑器窗格和文本窗格 API

本节列出了一些与文本和编辑器窗格相关的 API。 JEditorPane及其子类JTextPane的许多最有用的方法都是从JTextComponent类继承的。您可以在Literals 元件 API中找到JTextComponent的 API 表。另请参见JComponent 类,它描述了从JComponent继承的 API。

JEditorPane API,用于显示 URL 中的文本

方法或构造函数Description
JEditorPane(URL)

JEditorPane(String)
创建一个在指定 URL 上加载了文本的编辑器窗格。
setPage(URL)
setPage(String)
使用指定 URL 上的文本加载编辑器窗格(或文本窗格)。
URL getPage()获取编辑器窗格(或文本窗格)当前页面的 URL。

JTextPane API

方法或构造函数Description
JTextPane()

JTextPane(StyledDocument)
创建文本窗格。可选参数指定文本窗格的模型。
StyledDocument getStyledDocument
setStyledDocument(StyledDocument)
获取或设置文本窗格的模型。

使用文本窗格和编辑器窗格的示例

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

ExampleWhere DescribedNotes
TextSamplerDemo使用 Literals 组件使用每个 Swing 文本组件。
TextComponentDemoLiterals 组件功能提供自定义的文本窗格。说明了许多文本组件功能,例如撤消和重做,文档过滤器,文档侦听器,插入符号更改侦听器,以及如何将编辑操作与菜单和按键相关联。
TreeDemo如何使用树木使用编辑器窗格显示从 HTML 文件加载的帮助。

通过使用 JavaFX UI 控件:HTML 编辑器教程学习在 JavaFX 中编辑 HTML 文本。