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

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

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

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

使用文本窗格的示例

这是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)
获取或设置文本窗格的模型。

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

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

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

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

首页