读书人

Swing兑现Java代码编辑器实现关键词高

发布时间: 2012-09-07 10:38:15 作者: rapoo

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

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


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


????

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


?

protected int drawUnselectedText(Graphics g, int x, int y, int startOffset, int endOffset)    throws BadLocationException{    int docLength = getDocument().getLength();    int length = (endOffset < docLength ? endOffset : docLength) - startOffset;    return scanParagraph(g, x, y, startOffset, length);}
?

?

先是得到从起始位置到结束位置的长度,然后再交由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);
???????????
??????????? //下面的代码略
??????????? .
??????? }
??? }
??? //下面的代码略
??? .
}

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

读书人网 >软件架构设计

热点推荐