另一种方式处理JTextPane中的关键字显示
mport java.awt.Color; import java.util.StringTokenizer; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; import javax.swing.text.Element; import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.rtf.RTFEditorKit; /** *@author gao */ /** * @author Administrator * */ /** * @author Administrator * */ public class CustomizeStyledDocument extends DefaultStyledDocument { private int type = -1;// 数据连接类型 AttributeSet myAttributeSet = null; private MutableAttributeSet keyAttr, normalAttr; private MutableAttributeSet inputAttributes = new RTFEditorKit() .getInputAttributes(); private String[] keyWord = { "int", "float" }; public CustomizeStyledDocument(int type) { this.type = type; // 定义关键字显示属性 keyAttr = new SimpleAttributeSet(); StyleConstants.setForeground(keyAttr, Color.red); // 定义一般文本显示属性 normalAttr = new SimpleAttributeSet(); StyleConstants.setForeground(normalAttr, Color.black); } /** *插入字符串 */ public void insertString(int offset, String str, AttributeSet a) throws BadLocationException { this.myAttributeSet = a; super.insertString(offset, str, a); setSyntaxColor(offset, str.length()); } /** *删除字符串 */ public void remove(int offs, int len) throws BadLocationException { super.remove(offs, len); Element root = getDefaultRootElement(); int linebeg = root.getElementIndex(offs); dealLine(root,linebeg); } /** *根据一个范围,设置该范围内的的SyntaxColor */ private void setSyntaxColor(int offset, int len) throws BadLocationException { Element root = getDefaultRootElement(); int linebeg = root.getElementIndex(offset); int lineEnd = root.getElementIndex(offset + len); for(int i=linebeg;i<lineEnd+1;i++){ dealLine(root,i); } } /** * 处理一行中的Word */ private void dealLine(Element root,int curLine) { Element para = root.getElement(curLine); int start = para.getStartOffset(); int end = para.getEndOffset() - 1; String s=null; try { s = getText(start, end - start); } catch (BadLocationException e) { e.printStackTrace(); return; } int i = 0; int xStart = 0; // 分析关键字--- setCharacterAttributes(start, s.length(), normalAttr, false); MyStringTokenizer st = new MyStringTokenizer(s); while (st.hasMoreTokens()) { s = st.nextToken(); if (s == null) return; for (i = 0; i < keyWord.length; i++) { if (s.equals(keyWord[i])) break; } if (i >= keyWord.length) continue; xStart = st.getCurrPosition(); // 设置关键字显示属性 setCharacterAttributes(start + xStart, s.length(), keyAttr, false); } inputAttributes.addAttributes(normalAttr); } } /** * 拆分一行中的word * */ class MyStringTokenizer extends StringTokenizer { String sval = " "; String oldStr, str; int m_currPosition = 0, m_beginPosition = 0; MyStringTokenizer(String str) { super(str, " "); this.oldStr = str; this.str = str; } public String nextToken() { try { String s = super.nextToken(); int pos = -1; if (oldStr.equals(s)) { return s; } pos = str.indexOf(s + sval); if (pos == -1) { pos = str.indexOf(sval + s); if (pos == -1) return null; else pos += 1; } int xBegin = pos + s.length(); str = str.substring(xBegin); m_currPosition = m_beginPosition + pos; m_beginPosition = m_beginPosition + xBegin; return s; } catch (java.util.NoSuchElementException ex) { ex.printStackTrace(); return null; } } // 返回token在字符串中的位置 public int getCurrPosition() { return m_currPosition; } }
同样,使用时作为JTextPane中的Document即可
如果要可以识别“// “种类别的注释,可以加上以下内容
int pos = s.indexOf("//"); if(pos != -1){ setCharacterAttributes(pos+start, s.length()-pos, commentiAttr, true); if(pos==0) return; s=s.substring(0, pos); }
其中commentiAttr为自定义的注释的风格。