如何更好的使用JTextPane

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

如何更好的使用JTextPane,程序示例:

package com.JDAGUI;

import javax.swing.text.*;

import java.util.*;

import java.awt.*;

import com.JDA.*;

public class JDAStyledDocument extends DefaultStyledDocument

{

private int type = -1;//数据连接类型

AttributeSet myAttributeSet = null;

public JDAStyledDocument(int type)

{

this.type = type;

}

/**

*插入字符串

*/

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);

setSyntaxColor(offs);

}

/**

*获取制定位置的字符

*/

private String getPositionChar(int offset)

{

String str = "";

try

{

str = getText(offset,1);

}

catch(BadLocationException ex)

{

//ex.printStackTrace(System.out);

}

return str;

}

/**

*从指定的位置开始,倒推到第一个遇到空格位置

*/

private String getBeforeBlankString(int offset)

{

String str = "";

if(offset<0) return "";

str = getPositionChar(offset);

if(SyntaxMgr.isSpaceChar(str))

return "";

String r = getBeforeBlankString(offset-1);

return r + str;

}

/**

*从指定的位置开始,顺推到第一个遇到空格位置

*/

private String getAfterBlankString(int offset)

{

String str = "";

if(offset>getLength()) return "";

str = getPositionChar(offset);

if(SyntaxMgr.isSpaceChar(str))

return "";

String r = getAfterBlankString(offset+1);

return str + r;

}

/**

*根据Postion,向前判断,向后判断,设置颜色,返回设置颜色末尾的位置

*/

private int setSyntaxColor(int offset)

{

if(offset<0) return offset;//如果设置的位置不存在,可以不用考虑

if(myAttributeSet==null) return offset;//如果myAttributeSet为null,可以不用考虑

String ifSyntax = "";

String before = getBeforeBlankString(offset-1);

String after = getAfterBlankString(offset);

Syntax = (before + after).trim();

int start = offset-before.length();

int tmp_len = ifSyntax.length();

if(start<0 || tmp_len<=0) return offset;//如果设置颜色的字符串为空,返回

//设置颜色

StyleConstants.setForeground((MutableAttributeSet)myAttributeSet,

SyntaxMgr.isSyntax(type,ifSyntax));

setCharacterAttributes(start,tmp_len,myAttributeSet,true);

return start + tmp_len;

}

/**

*根据一个范围,设置该范围内的的SyntaxColor

*/

private int setSyntaxColor(int offset,int len)

throws BadLocationException

{

//如果范围不存在,不考虑

if(offset<0 || len<0) return offset;

int tmp_offset = offset;

while(tmp_offset<offset + len)

{

tmp_offset = setSyntaxColor(tmp_offset);

tmp_offset = getNextWordOffset(tmp_offset);

}

tmp_offset = setSyntaxColor(tmp_offset);//设置循环完后的最后一个单词

return tmp_offset;

}

/**

*根据Postion,获得下一个单词的开始点

*/

private int getNextWordOffset(int offset)

{

int rOffset = offset;

int textlength = getLength();

while(rOffset<=textlength && offset>=0)

{

String str = getPositionChar(rOffset);

if(!SyntaxMgr.isSpaceChar(str))

{

break;

}

rOffset+=1;

}

if(rOffset!=offset)//设置间隔的颜色

{

//设置颜色

StyleConstants.setForeground((MutableAttributeSet)myAttributeSet,

SyntaxColorMgr.getSpaceColor());

setCharacterAttributes(offset,rOffset-offset,myAttributeSet,true);

}

return rOffset;

}

}

到此为此,做好了一个适用于JTextPane的Document。

可以这样使用

JTextPane sqlPane = new JTextPane(new JDAStyledDocument(type));

因为这个例子中使用了根据数据库类型不同来显示不同的关键字,所以传了一个int type。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航