`

Swing实现Java代码编辑器实现关键词高亮显示

    博客分类:
  • JAVA
 
阅读更多

本文主要记录怎么给代码编辑器实际语法高亮显示的功能,先来张效果图吧:



    

    当JEditorPane被创建时,它会把createDefaultEditorKit()方法(javax.swing.text.EditorKit的子类对象)的返回值作为默认的编辑器工具包,然后将文本的编辑与显示工作交给这个工具包。其原型为:


 

Java代码  收藏代码
  1. protected EditorKit createDefaultEditorKit()  
  2. {  
  3.     return new PlainEditorKit();  
  4. }  
 

    这个方法默认是返回一个PlainEditorKit对象,也就是一个纯文本的编辑器工具包,所以JEditorPane默认并没有格式化与彩色显示等功 能,看来我们先要定制一个支持彩色显示的EditorKit,然后把它作为createDefaultEditorKit()的返回值。

EditorKit 基本上什么也没有做,只是提供了很多抽象方法给它的子类去实现,Swing默认已经给它添加了一个子类DefaultEditorKit(Swing常用 的一招,就是给抽象类前面加个Default进行最基本的实现),既然是Default,那它所提供的功能肯定和一个记事本没有多大区别,这要是继承下 来,有多少方法需要覆盖啊,别慌,查看一下Swing的源码,你会发现Swing还提供了一个继承自DefaultEditorKit的类 StyledEditorKit,顾名思义,这个类肯定为我们提供了很多支持格式化显示的方法,又是一个巨人,快,赶紧拉过来往肩上爬。

 

 

 

  接下来就是覆盖StyledEditorKit中的相关方法了,其实有很多方法都可以覆盖,但是意义不是很大,比如

public  String getContentType();

    这个方法是获得此工具包声明支持的数据的 MIME 类型,默认是text/plain,也就是文本文档,Java文件说白了也是文本文档,不过可以让它返回 text/java 以唯一标识编辑器所支持的MIME类型。

EditorKit中有两个重要的方法实现对文档的管理与显示:

public   abstract  Document createDefaultDocument();

创建一个适合此编辑器类型文本存储模型。EditorKit把对文本文档的管理功能交给了这个方法的返回值。

public   abstract  ViewFactory getViewFactory();

获取适合生成此工具包生成的任何模型视图的工厂。EditorKit把编辑器的显示功能交给了这个方法的返回值,比如什么字符显示成什么样子,什么颜色等。我们必须覆盖这两个方法以实现自定义编辑器的功能。

因为我们的编辑器和JEditorPane唯一不同的可能就是代码怎么来显示,所以createDefaultDocument()可以返回一个默 认的javax.swing.text.DefaultStyledDocument 就行,对于getViewFactory,我们需要定制一个ViewFactory视图来实现编辑器独有的各种显示功能。

ViewFactory在Java中被定义为一个接口,里面提供了唯一的一个方法:

public  View create(Element elem);

 

这个方法根据给定的文档的结构化元素创建一个视图。在这个方法中,我们只需要返回一个继承自View的视图即可,真正的显示任务是交给这个视图的。因此,我们的ViewFactory类很简单:

Java代码  收藏代码
  1. public class JavaViewFactory implements ViewFactory  
  2. {  
  3.     /**//* 
  4.      * (non-Javadoc) 
  5.      *  
  6.      * @see javax.swing.text.ViewFactory#create(javax.swing.text.Element) 
  7.      */  
  8.     public View create(Element element)  
  9.     {  
  10.         return new JavaEditorView(element);  
  11.     }  
  12. }  

 接下来的重点就是这个JavaEditorView了,所有的语法高亮等显示功能都是交给它来完成的

 

 

View是一个抽象类,Swing默认给我们提供了多个它的子类,AsyncBoxView, ComponentView, CompositeView, GlyphView, IconView, ImageView, PlainView 以实现对不同文档类型的显示,当中只有PlainView是与文本文档相关的,它实现简单的多行文本视图的 View 接口,该文本视图的文本只有一种字体和颜色,没错,我们的JavaEditorView需要继承自PlainView。(http://www.my400800.cn )

 

PlainView提供了很多方法进行文本文档的视图显示,要实现高亮显示,我们关心的有两个方法:

protected   int  drawSelectedText(Graphics g,  int  x,  int  y,  int  p0,  int  p1) throws  BadLocationException

一看名字就知道这个方法是控制选中状态下的显示方式,由于本文只讨论非选中状态。所以重点看一下另外一个方法:

protected   int  drawUnselectedText(Graphics g,  int  x,  int  y,  int  p0,  int  p1) throws  BadLocationException

这个方法将模型中给定的范围呈现为正常的未选定文本。使用前景色或指定的颜色显示文本。

参数:
g  - 图形上下文(做Swing的人再熟悉不过了,文本也是画出来的)
x  - 起始 X 坐标,该值 >= 0
y  - 起始 Y 坐标,该值 >= 0
p0 - 模型中的起始位置,该值 >= 0
p1 - 模型中的结束位置,该值 >= 0

下面是覆盖后的实现:

Java代码  收藏代码
  1. protected int drawUnselectedText(Graphics g, int x, int y, int startOffset, int endOffset)  
  2.     throws BadLocationException  
  3. {  
  4.     int docLength = getDocument().getLength();  
  5.     int length = (endOffset < docLength ? endOffset : docLength) - startOffset;  
  6.   
  7.     return scanParagraph(g, x, y, startOffset, length);  
  8. }  
 

 

先是得到从起始位置到结束位置的长度,然后再交由scanParagraph去处理指定长度的文本,其实也就是怎么把它画出来。
对于一个Java代码编辑器,要考虑类名,运算符,数字,关键字等的显示方式,所以scanParagraph要做的事情很多,本文只以怎么么高亮显示类名为例来说明:

private int scanParagraph(Graphics g, int x, int y, int startOffset, int length) throws BadLocationException
{
    Segment seg = new Segment();
    //得到编辑器组件
    JavaCodeEditor editor = (JavaCodeEditor) getContainer();
    //得到startOffset,位置开始的length个长度的字符串,其实也就是我们要处理的字符串
    getDocument().getText(startOffset, length, seg);
    for (int wordIndex = 0; wordIndex < seg.length();)
    {
        char currentChar = seg.charAt(wordIndex);
        if (Character.isJavaIdentifierStart(currentChar))
        {
            //下面我默认用Object说明,实际中要处理seg中的内容。
            String identifier = "Object";
            int len = identifier.length();

            //比如说以红色显示类名
            Segment text = getLineBuffer();
            getDocument().getText(startOffset + wordIndex, len, text);
            //还有其它样式的话只管给g加
            g.setColor(color);

            Utilities.drawTabbedText(text, x, y, g, this, startOffset + wordIndex);
            
            //下面的代码略
            .
        }
    }
    //下面的代码略
    .
}

 

 

 

 

分享到:
评论

相关推荐

    Swing实现编辑器(支持语法高亮)

    总的来说,使用Swing实现一个支持语法高亮的编辑器是一项挑战性的任务,需要深入理解GUI编程、文本处理和解析技术。但通过精心设计和适当利用已有资源,可以创建出功能强大、用户友好的代码编辑器。

    RSyntaxTextArea, 用于 Java Swing 应用程序的语法高亮,代码折叠文本编辑器.zip

    RSyntaxTextArea, 用于 Java Swing 应用程序的语法高亮,代码折叠文本编辑器 RSyntaxTextArea是 Java Swing 应用程序的一个可以自定义的语法高亮文本组件。 开箱即用,它支持 40 + 编程语言。代码折叠。搜索和替换...

    java swing实现pdf阅读器

    在Java Swing中实现PDF阅读器是一项技术挑战,涉及到对PDF文件格式的理解、IO操作、Swing组件的使用以及可能的第三方库集成。 PDF(Portable Document Format)是一种广泛使用的文件格式,用于存储文档,包括文本...

    Javasheji.rar_Java代码编辑器_java课程设计_文档编辑器

    在这个“Javasheji.rar”压缩包中,包含了一个关于Java代码编辑器的课程设计项目,以及一个名为“Javasheji.doc”的文档,该文档详细阐述了课程设计的实现过程和相关知识点。 首先,我们要理解Java代码编辑器的基本...

    MintChime-Editor:一个图形化的代码编辑器,带有多语言的选项卡和语法高亮,用 Java Swing 编写

    总的来说,MintChime-Editor是一个功能全面、跨平台的代码编辑器,它基于Java Swing,提供多语言支持和语法高亮,以满足不同编程需求。对于那些寻求强大、灵活和高效编码工具的开发者来说,MintChime-Editor无疑是一...

    java swing文本编辑器

    总之,创建一个Java Swing文本编辑器涉及到多个技术层面,包括组件使用、事件处理、文件操作、文本格式化以及可能的扩展功能实现。通过深入理解和实践这些知识点,开发者可以构建出功能完备且用户友好的文本编辑器。

    SGS Swing语法加亮编辑器源码

    SGS Swing语法加亮编辑器通过高亮显示SGS语法的关键字、操作符和注释,使得代码更易于阅读和理解,从而降低错误率,提升编写质量。 编辑器采用Java Swing作为UI框架,Swing是一个用于构建桌面应用程序的Java库,...

    基于Swing的简单Java编辑器

    **基于Swing的简单Java编辑器** 在Java编程领域,Swing是一个用于构建桌面应用程序的图形用户界面(GUI)工具包。它属于Java Foundation Classes (JFC)的一部分,由Sun Microsystems开发,现在由Oracle公司维护。...

    JAVA语言的文本编辑器的毕业设计,采用JAVA Swing框架进行开发,并使用JavaFX实现代码高亮和自动补全功能

    该文本编辑器采用JAVA Swing框架进行开发,并使用JavaFX实现代码高亮和自动补全功能。具体实现思路如下: ### 1. 打开、保存、新建文本文件 使用JFileChooser类实现文件的打开、保存和新建功能。用户可以通过菜单...

    java swing里支持,js,java编程语言,关键字高亮显示

    在描述中提到的关键字高亮显示,这是一个在文本编辑器或代码查看器中常见的功能,它有助于提高代码可读性和用户体验。关键字高亮通常涉及到以下几个核心概念: 1. **颜色主题**:在Java Swing中,你可以通过自定义...

    java实现一款编辑器的源码

    5. **文本格式化和高亮**:为了增强用户体验,编辑器可能实现了代码高亮功能。这通常需要自定义`SyntaxHighlighter`类,根据不同的编程语言关键字和语法结构进行文本颜色标记。 6. **查找替换功能**:在编辑器中,...

    Java实现的编辑器语法着色功能

    本文主要关注的是“Java实现的编辑器语法着色功能”。语法着色是编程环境中的一项重要特性,它通过为不同类型的编程元素(如关键字、注释、字符串等)赋予不同的颜色,使得代码更易于阅读和理解。在Java环境下,我们...

    本编辑器第一版(java源代码)

    在本项目中,标题为"本编辑器第一版(java源代码)",这表明我们正在探讨一个基于Java编程语言实现的文本编辑器的初版。这个编辑器可能包含基本的文本编辑功能,如文本输入、剪切、复制、粘贴、查找和替换等。作为...

    swing 文本编辑器

    在 Swing 应用中,这些资源文件可以用来实现文本编辑器的多语言支持。 6. **src**: 这是源代码目录,其中包含了 Java 源代码文件。在 Swing 文本编辑器项目中,你会在这里找到关于如何使用 RSyntaxTextArea、...

    编辑器(java课程设计)

    这个Java编辑器的设计和实现涉及了多个Java编程的核心概念和技术。首先,它是基于Java Swing库构建的图形用户界面(GUI),Swing提供了丰富的组件来创建窗口、菜单、按钮等元素,使得用户可以进行文本输入、保存、...

    RSyntaxTextArea,Java Swing应用程序的语法突出显示、代码折叠文本编辑器。.zip

    RSyntaxTextArea是一款专门为Java Swing应用程序设计的开源文本编辑器组件,它提供了丰富的功能,如语法高亮、代码折叠等,使得开发人员能够轻松地在自己的应用中集成一个强大的代码编辑界面。这款组件非常适合用于...

    Swing文本编辑器

    Swing文本编辑器的核心组件是`JTextArea`,这是一个可以显示和编辑多行文本的组件。我们可以使用`JScrollPane`来包裹`JTextArea`,以便在文本内容过多时自动滚动。`JScrollPane`提供了水平和垂直滚动条,使得用户...

    jj.rar_JJ_java 文本编辑器_java 编辑器

    通过阅读和分析这部分代码,开发者可以了解到如何在Java中实现文本编辑器的基本功能,如打开、保存文件,高亮显示代码,以及可能的自定义快捷键设置等。 "www.pudn.com.txt"看起来像是一个示例文本文件,可能是用来...

    java编辑器源码(源代码)的设计与实现

    Java编辑器源码的设计与实现是一项复杂而富有挑战性的任务,涉及到许多核心的编程概念和技术。这个源代码实例提供了一个完整的解决方案,可以帮助开发者深入理解Java编程语言,以及如何构建一个功能丰富的文本编辑器...

Global site tag (gtag.js) - Google Analytics