<b>若何更好的操纵JTextPane</b>[Java编程]
本文“<b>若何更好的操纵JTextPane</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
我常常在网上瞥见很多朋友问,如安在JTextArea中掌握字符,若何设置特定字符的颜色等等.我在用Java做一个SQL查询解析器中发现了一个对比好的办理筹划就是利用JTextPane,那么若何更好的利用JTextPane呢,我现摘自我那部份程序的一部份,供大家参考.
package com.JDAGUI;
import javax.swing.text.*;
import java.util.*;
import java.awt.*;
import com.JDA.*;
/**
*@author whxu
*/
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就对比简单了.
可以这样利用
JTextPane sqlPane = new JTextPane(new JDAStyledDocument(type));
因为我这个例子中利用了按照数据库范例差别来显示差别的关键字,所以我传了一个int type.
以上是“<b>若何更好的操纵JTextPane</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |