如何实现代码编辑器的语法高亮显示功能:JEditorPane与EditorKit详解
本文主要记录为代码编辑器赋予实际语法高亮显示功能的方法,首先来看一张效果图吧:

JEditorPane 创建时,会把 createDefaultEditorKit()方法(javax.swing.text.EditorKit 的子类对象)的返回值当作默认的编辑器工具包,接着把文本的编辑与显示工作交给这个工具包。
创建默认的编辑器工具包,这个工具包受到保护。
{3
returnnewPlainEditorKit();4
这个方法默认会返回一个 PlainEditorKit 对象,此对象是一个纯文本的编辑器工具包。因此,JEditorPane 默认不具备格式化与彩色显示等功能。看来我们首先需要定制一个支持彩色显示的 EditorKit,接着将其作为 createDefaultEditorKit()的返回值。
EditorKit 没有做太多事,只是给它的子类留下了很多抽象方法去实现。Swing 默认给它添加了一个子类 DefaultEditorKit,这是 Swing 常用的做法,即给抽象类前面加个 Default 来进行最基本的实现。既然是 Default,它所提供的功能和记事本差别不大。如果继承它,需要覆盖很多方法。别担心,查看 Swing 的源码会发现,Swing 还提供了一个继承自 DefaultEditorKit 的类 StyledEditorKit。从名字就能看出,这个类为我们提供了很多支持格式化显示的方法。它就像一个巨人,赶紧把它拉过来往肩上爬。
接下来要做的是覆盖 StyledEditorKit 中的相关方法。实际上有许多方法都能够被覆盖,然而这些方法的意义并不是特别大,例如:
publicStringgetContentType();
这个方法用于获取此工具包声明支持的数据的 MIME 类型,其默认值为 text/plain,此类型即文本文档。Java 文件本质上也是文本文档,不过能够让它返回 text/java ,以此来唯一标识编辑器所支持的 MIME 类型。
EditorKit 里存在两个重要的方法,这两个方法能够实现对文档的管理以及显示。
创建默认文档的是一个抽象的公共方法。
创建一个适用于此编辑器类型的文本存储模型。这个编辑器的 EditorKit 将对文本文档的管理功能赋予了这个方法的返回值。
获取视图工厂的方法是一个抽象方法,它没有具体的实现,需要在子类中进行具体的定义。这个方法的返回类型是 ViewFactory 类型,它表示一个用于创建视图的工厂对象。通过调用这个方法,我们可以获取到一个具体的视图工厂对象,然后使用这个对象来创建各种视图。
获取能够生成此工具包所生成的任何模型视图的工厂。EditorKit 将编辑器的显示功能赋予了这个方法的返回值,例如什么样的字符显示为何种样子,何种颜色等。我们必须对这两个方法进行覆盖,以实现自定义编辑器的功能。
由于我们的编辑器与 JEditorPane 唯一可能存在差异的地方在于代码的显示方式,所以只需让 createDefaultDocument()返回一个默认的 javax.swing.text.DefaultStyledDocument 即可。而对于 getViewFactory,我们需要定制一个 ViewFactory 视图,以实现编辑器所独有的各种显示功能。
ViewFactory 在 Java 里被定义成一个接口,此接口中提供了一个方法,且这个方法是唯一的。
创建一个名为 publicView 的对象,并将其作为方法的返回值,该方法接收一个名为 elem 的元素作为参数。
这个方法依据给定文档的结构化元素构建出一个视图。在该方法里,我们仅需返回一个源自 View 的视图就行,而实际的显示任务是交由这个视图去完成的。所以,我们的 ViewFactory 类较为简单。