Java 教程已针对 JDK 8 编写。本页面中描述的示例和做法不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java 语言变更以了解 Java SE 9 及后续版本中更新的语言特性的摘要。
请参阅JDK 发行说明,了解所有 JDK 版本的新功能、增强功能和已删除或已弃用选项的信息。
有两个 Swing 类支持样式文本:JEditorPane 类及其子类 JTextPane 类。JEditorPane 类是 Swing 样式文本组件的基础,它提供了一种机制,可以添加对自定义文本格式的支持。如果您只需要无样式文本,请使用文本区域。
您可以通过运行 TextSamplerDemo 来查看编辑器面板和文本面板的使用情况。下面是 TextSamplerDemo 示例的图片。
点击“启动”按钮以使用 Java™ Web Start (下载 JDK 7 或更高版本)运行 TextSamplerDemo。或者,要自行编译并运行示例,请参考 示例索引。
TextSamplerDemo 示例只是初步展示了编辑器面板和文本面板的功能。然而,右上角的编辑器面板展示了一项方便易用的功能:它显示从 URL 加载的不可编辑的帮助信息。右下角的文本面板演示了您可以轻松地将图像甚至组件直接嵌入文本面板中。
Swing 文本 API 功能强大且庞大,我们可以为使用编辑器面板和文本面板编写一本专门的书籍。本节介绍它们的功能,提供了何时使用哪种组件的提示,并指向其他信息来源。
您可以在不了解 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
后不应依赖于数据已完全加载。
为了使用编辑器面板和文本面板,您需要了解文本系统,该系统在 文本组件特性 中描述。有关编辑器面板和文本面板的一些事实分散在该部分中。在这里,我们再次列出这些事实,并提供更多细节。此信息应该帮助您了解编辑器面板和文本面板之间的区别,以及何时使用哪种组件。
setPage
方法从 URL 加载文本。JEditorPane 类还提供了构造函数,可以使用 URL 初始化编辑器面板。JTextPane 类没有这样的构造函数。请参见使用编辑器面板显示来自 URL 的文本,以了解使用此功能将不可编辑的编辑器面板加载为 HTML 格式文本的示例。
请注意,使用 setPage
方法时,文档和编辑器工具包可能会发生更改。例如,如果编辑器面板包含普通文本(默认情况下),并使用 HTML 加载它,则文档将更改为 HTMLDocument
实例,并且编辑器工具包将更改为 HTMLEditorKit
实例。如果您的程序使用 setPage
方法,请确保调整代码以适应面板文档和编辑器工具包实例的可能更改(在新文档上重新注册文档侦听器等)。
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 及其子类 JTextPane 最有用的方法是从 JTextComponent
类继承的。您可以在 文本组件 API 中找到 JTextComponent
的 API 表。还请参阅描述从 JComponent
继承的 API 的 JComponent 类。
方法或构造函数 | 描述 |
---|---|
JEditorPane(URL) JEditorPane(String) |
创建加载指定 URL 处文本的编辑器面板。 |
setPage(URL) setPage(String) |
加载编辑器面板(或文本面板)中指定 URL 处的文本。 |
URL getPage() | 获取编辑器面板(或文本面板)当前页面的 URL。 |
方法或构造函数 | 描述 |
---|---|
JTextPane() JTextPane(StyledDocument) |
创建文本面板。可选参数指定文本面板的模型。 |
StyledDocument getStyledDocument setStyledDocument(StyledDocument) |
获取或设置文本面板的模型。 |
要开始使用文本,您可能想运行这些程序并检查其代码,以找到与您想要执行的操作类似的内容。
示例 | 描述位置 | 备注 |
---|---|---|
TextSamplerDemo |
使用文本组件 | 使用每个 Swing 文本组件。 |
TextComponentDemo |
文本组件特性 | 提供一个自定义的文本面板。演示了许多文本组件特性,如撤消和重做、文档过滤器、文档侦听器、插入符更改侦听器,以及如何将编辑操作与菜单和键盘快捷键关联。 |
TreeDemo |
如何使用树 | 使用编辑器面板显示从 HTML 文件加载的帮助。 |
通过 Using JavaFX UI Controls: HTML Editor 教程,了解如何在 JavaFX 中使用 HTML 编辑文本。