//一个可作为JTextPane的document的代码
import java.awt.Color;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.StyleConstants;
/**
*@author gao
*/
public class CustomizeStyledDocument extends DefaultStyledDocument {
private int type = -1;// 数据连接类型
AttributeSet myAttributeSet = null;
public CustomizeStyledDocument(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);
ifSyntax = (before + after).trim();
// System.out.println(ifSyntax);
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;
tmp_offset = setSyntaxColor(tmp_offset);
while (++tmp_offset < offset + len) {
// tmp_offset = setSyntaxColor(tmp_offset);
tmp_offset = doMiddleWord(tmp_offset);
}
tmp_offset = setSyntaxColor(tmp_offset);// 设置循环完后的最后一个单词
return tmp_offset;
}
//处理paste时中间word的显示
private int doMiddleWord(int offset) {
String str = getAfterBlankString(offset);
String ifSyntax = str.trim();
System.out.println(ifSyntax);
int tmp_len = ifSyntax.length();
if (offset < 0 || tmp_len <= 0)
return offset;// 如果设置颜色的字符串为空,返回
// 设置颜色
StyleConstants.setForeground((MutableAttributeSet) myAttributeSet,
SyntaxMgr.isSyntax(type, ifSyntax));
setCharacterAttributes(offset, tmp_len, myAttributeSet, true);
return offset + tmp_len;
}
}
class SyntaxMgr {
static boolean isSpaceChar(String str) {
return (" ".equals(str)|| "\n".equals(str));
}
static Color getSpaceColor() {
return Color.black;
}
static Color isSyntax(int type, String str) {
if (str.equals("if") || str.equals("else") || str.equals("class")) {
return Color.blue;
}
return Color.black;
}
}
//用的时候将此类的实例作为JTextPane的document即可。
分享到:
相关推荐
NULL 博文链接:https://icarusliu.iteye.com/blog/1412007
JAVA-----JTextPane实例 代码
JTextPane使用,可以传图片,文字等
演示、说明程序 博文链接:https://bps.iteye.com/blog/136627
SWT JTextPane 可以把控件中需要的字符串的颜色修改成自己想要的颜色
课程设计期间做的Java的桌面端小程序,可以发送Emoji表情的聊天室,另外在文件夹中放置了自己的关键代码部分解析,关于emoji部分可查看笔者博客...
本源码实现了 文本区里加图片和插入艺术字的功能 窗口使用Windows窗体风格
NULL 博文链接:https://icarusliu.iteye.com/blog/2098986
Java制作的网页浏览器和源代码查看器,仿IE的网页浏览功能,不支持HTML5,窗口采用上下分屏显示的方式,上面显示网页浏览器,下面显示该网页的源代码,JTextField jtfAddress; //输入html文件地址或网址 ...
JTextPane jtpShow; //显示文件 JLabel jlInfo; //提示信息 public HTTPBrowserDemo() { super("韩公达制作的html浏览器"); //调用父类构造函数 jtfAddress=new JTextField(20); //实例化地址输入框 jbGo...
这位是我刚做的一个windows记事本;使用的是JTextPane做的,已经实现全部的功能;还就有语法高亮和插入图片的功能
NULL 博文链接:https://gh0769.iteye.com/blog/598839
JTextPane jtpShow; //显示文件 JLabel jlInfo; //提示信息 public HTTPBrowserDemo(){ super("html浏览器"); //调用父类构造函数 jtfAddress=new JTextField(20); //实例化地址输入框 jbGo=new...
用JTextPanel实现文本带下划线功能