package my2;
import java.util.StringTokenizer;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.rtf.RTFEditorKit;
/**
* 关键字特殊处理面板
* @author Administrator
*
*/
public class MyTextPane extends JTextPane {
/**
*
*/
private static final long serialVersionUID = -66377652770879651L;
protected StyleContext m_context;
protected DefaultStyledDocument m_doc;
private MutableAttributeSet keyAttr, normalAttr;
private MutableAttributeSet bracketAttr;
private MutableAttributeSet inputAttributes = new RTFEditorKit()
.getInputAttributes();
/**
* 所有关键字
*/
private final static String[] _keys = new String[] { "select", "from",
"where", "like", "and", "or", "order", "group", "sum", "avg",
"not", "in", "create", "grand", "null", "count", "max", "min",
"start", "with", "connect", "update", "delete", "set", "values",
"view", "table", "as", "distinct", "into", "drop", "is", "on",
"exists", "by", "tree", "table", "cust", "union", "dual",
"trigger", "function", "procedure", "begin", "end", "for", "loop",
"while", "insert", "count", "if", "else", "then", "commit",
"rollback", "return", "declare", "when", "elsif", "open", "fetch",
"close", "exit", "exception", "execute" };
/**
* 所与排除字符集
*/
private final static char[] _character = new char[] { '(', ')', ',', ';',
':', '\t', '\n', '+', '-', '*', '/' };
/**
* 初始化,包括关键字颜色,和非关键字颜色
*/
public MyTextPane() {
super();
m_context = new StyleContext();
m_doc = new DefaultStyledDocument(m_context);
this.setDocument(m_doc);
this.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
dealSingleRow();
}
});
// 义关键字显示属性
keyAttr = new SimpleAttributeSet();
StyleConstants.setForeground(keyAttr, Color.RED);
// 义一般文本显示属性
normalAttr = new SimpleAttributeSet();
// StyleConstants.setFontFamily(normalAttr, "serif");
StyleConstants.setBold(normalAttr, false);
StyleConstants.setForeground(normalAttr, Color.black);
bracketAttr = new SimpleAttributeSet();
StyleConstants.setForeground(bracketAttr, Color.RED);
// StyleConstants.setFontFamily(bracketAttr, "serif");
StyleConstants.setBold(bracketAttr, true);
}
/**
* 设置大括号颜色
* @param _text
*/
private void setBracketColor(String _text) {
int len = _text.length();
for (int i = 0; i < len; i++) {
char ch = _text.charAt(i);
if (ch == '{' || ch == '}') {
m_doc.setCharacterAttributes(i, 1, bracketAttr, false);
}
}
}
/**
* 判断字符是不是在排除字符行列
* @param _ch
* @return
*/
private boolean isCharacter(char _ch) {
for (int i = 0; i < _character.length; i++) {
if (_ch == _character[i]) {
return true;
}
}
return false;
}
/**
* 设置关键字颜色
* @param _key
* @param _start
* @param _length
* @return
*/
private int setKeyColor(String _key, int _start, int _length) {
for (int i = 0; i < _keys.length; i++) {
int li_index = _key.indexOf(_keys[i]);
if (li_index < 0) {
continue;
}
int li_legnth = li_index + _keys[i].length();
if (li_legnth == _key.length()) {
if (li_index == 0) {//处理单独一个关键字的情况,例如:if else 等
m_doc.setCharacterAttributes(_start, _keys[i].length(),
keyAttr, false);
} else {//处理关键字前面还有字符的情况,例如:)if ;else 等
char ch_temp = _key.charAt(li_index - 1);
if (isCharacter(ch_temp)) {
m_doc.setCharacterAttributes(_start + li_index,
_keys[i].length(), keyAttr, false);
}
}
} else {
if (li_index == 0) {//处理关键字后面还有字符的情况,例如:if( end;等
char ch_temp = _key.charAt(_keys[i].length());
if (isCharacter(ch_temp)) {
m_doc.setCharacterAttributes(_start, _keys[i].length(),
keyAttr, false);
}
} else {//处理关键字前面和后面都有字符的情况,例如:)if( 等
char ch_temp = _key.charAt(li_index - 1);
char ch_temp_2 = _key.charAt(li_legnth);
if (isCharacter(ch_temp) && isCharacter(ch_temp_2)) {
m_doc.setCharacterAttributes(_start + li_index,
_keys[i].length(), keyAttr, false);
}
}
}
}
return _length + 1;
}
/**
* 处理一行的数据
* @param _start
* @param _end
*/
private void dealText(int _start, int _end) {
String text = "";
try {
text = m_doc.getText(_start, _end - _start).toUpperCase();
} catch (BadLocationException e) {
e.printStackTrace();
}
if (text == null || text.equals("")) {
return;
}
int xStart = 0;
// 析关键字---
m_doc.setCharacterAttributes(_start, text.length(), normalAttr, false);
MyStringTokenizer st = new MyStringTokenizer(text);
while (st.hasMoreTokens()) {
String s = st.nextToken();
if (s == null)
return;
xStart = st.getCurrPosition();
setKeyColor(s.toLowerCase(), _start + xStart, s.length());
}
setBracketColor(text);
inputAttributes.addAttributes(normalAttr);
}
/**
* 在进行文本修改的时候
* 获得光标所在行,只对该行进行处理
*/
private void dealSingleRow() {
Element root = m_doc.getDefaultRootElement();
// 光标当前行
int cursorPos = this.getCaretPosition(); // 前光标的位置
int line = root.getElementIndex(cursorPos);// 当前行
Element para = root.getElement(line);
int start = para.getStartOffset();
int end = para.getEndOffset() - 1;// 除\r字符
dealText(start, end);
}
/**
* 在初始化面板的时候调用该方法,
* 查找整个篇幅的关键字
*/
public void syntaxParse() {
Element root = m_doc.getDefaultRootElement();
int li_count = root.getElementCount();
for (int i = 0; i < li_count; i++) {
Element para = root.getElement(i);
int start = para.getStartOffset();
int end = para.getEndOffset() - 1;// 除\r字符
dealText(start, end);
}
}
}
/**
* 在分析字符串的同时,记录每个token所在的位置
*
*/
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 关键字变色”和描述“SWT JTextPane 可以把控件中需要的字符串的颜色修改成自己想要的颜色”中,我们关注的主要知识点是`JTextPane`如何实现特定关键字的高亮显示,也就是改变颜色。...
5. **实时更新**:为了实现实时语法高亮,需要监听文本组件的 DocumentListener。每当文档内容更改时,都需要重新解析代码并更新样式。 6. **优化性能**:由于实时高亮可能对性能产生影响,特别是对于大型代码文件...
除了关键字高亮外,还可以考虑实现以下功能: - 字符串高亮 - 注释高亮 - 数字高亮 - 方法名高亮 这些可以通过扩展关键字列表和使用不同的样式来实现。 #### 四、总结 通过上述内容,我们可以了解到Java文本编辑...
开发者可能会使用`JTextPane`或`JEditorPane`组件来实现代码编辑功能,并结合正则表达式来匹配并高亮显示Java关键字。 另外,Java记事本中的高亮显示可能涉及到颜色样式和字体设置。在Java中,可以通过设置`...
- **染色模块**:实现关键字和类库名的高亮显示,关键在于理解和使用StyledDocument的charAtAttributes方法。 4. **详细设计**: - 模仿Windows记事本的界面设计,主要挑战在于实现关键字染色算法和查找替换算法...
关键字和类库名的高亮显示,是通过StyledDocument的`setCharacterAttributes`方法实现,这增强了代码的视觉效果,便于编程时快速识别。此外,良好的设计模式使得代码结构清晰,方便后续维护和扩展。
这个项目利用了Java Swing库中的JTextPane组件来构建用户界面和处理文本操作。JTextPane是一个高级的文本组件,能够支持富文本格式,如字体样式、颜色以及图片的插入。 1. **JTextPane组件**:JTextPane是Java AWT...
- 高亮模块:通过特定算法实现关键字和类库名的高亮显示。 三、详细设计 1. 主类:作为程序的入口点,负责实例化窗口并显示。 2. 窗体类(myfr):实现窗口的基本结构和组件布局。 3. 字体类(MyFont):处理字体...
考虑到需要实现语法高亮,选择了JTextPane组件,因为它能够支持字符的色彩和字体样式设置,比JTextArea更适合这个需求。 在【详细设计】环节,报告提到了一个名为CodeEditor的类,它是JFrame的子类。在这个类中,...
它不仅提供代码高亮显示,还有诸如自动完成、错误检测等高级功能。本文主要关注的是“Java实现的编辑器语法着色功能”。语法着色是编程环境中的一项重要特性,它通过为不同类型的编程元素(如关键字、注释、字符串等...
实例114 transient关键字的应用 143 5.7 接口和内部类 145 实例115 使用sort()方法排序 145 实例116 简化compareTo()方法的重写 146 实例117 策略模式的简单应用 148 实例118 适配器模式的简单应用 149 实例119 普通...
3. **文本组件**: 在GUI中,我们通常使用JTextArea或JTextPane来显示和编辑文本。JTextArea更适合纯文本,而JTextPane可以支持富文本格式,如字体和颜色。我们需要了解这些组件的基本用法,以及如何添加事件监听器来...
1. **Swing或JavaFX组件**:开发者可能使用了JTextComponent家族(如JTextPane或JEditorPane)来实现文本编辑功能,它们支持格式化文本和嵌入式对象。如果使用了JavaFX,则可能涉及TextFlow和TextArea等组件。 2. *...