论坛首页 Java企业应用论坛

在JEditor中简单实现SQL关键字高亮,不知道是否还有其它更好的办法。

浏览 4083 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-17  
  根据网上有一篇关于在JEditor中实现关键字高亮的文章,自己具体实现了一下。效果与jar(包含源代码)见附件。
现在有些困惑的是字符数组复制,每次画一行字符的时候都要从MODEL里将数据复制出来,而且在调试过程中,发现swing会重复执行一些代码-比如,JEditor在构建的时候,就会执行创建Document,Content这些对象,做为默认的对象,但在我设置了EditorKit后,它又要重新执行一下那些代码路径,比如分配数组空间之类的。我想如果能有一个构建方法直接将我的EditorKit传进去,就执行一次。
  • 大小: 17.6 KB
   发表时间:2011-07-17  
对于这种高亮问题 建议使用给字符设置字符集的办法 同时使用JTextPane而不是JEditorPane
我写了个简单的:

import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.util.LinkedList;
import java.util.List;

import javax.swing.*;
import javax.swing.text.*;

public class SQLEditor extends JFrame {

    public SQLEditor() {
        super("SQL Editor");
        editorPane = new JTextPane();
        editorPane.addKeyListener(new KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent e) {
                highlight();
            }
        });
        this.add(new JScrollPane(editorPane));
        this.setSize(300, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        KEYWORDS = new LinkedList<String>();
        KEYWORDS.add("SELECT");
        KEYWORDS.add("FROM");
        KEYWORDS.add("WHERE");
        KEYWORDS.add("INSERT");
        KEYWORDS.add("DELETE");
        KEYWORDS.add("UPDATE");
    }

    private void highlight() {
        try {
            Document doc = editorPane.getDocument();
            //替换掉所有回车符(回车符会导致错位)
            String text = editorPane.getText().replace("\r", "");
            //分割为单词
            String[] words = text.split("\\s");
            int start = 0;
            int end = 0;

            for (String word : words) {
                start = text.indexOf(word, end);
                end = start + word.length();
                boolean found = false;
                // 匹配高亮关键字
                for (String keyword : KEYWORDS) {
                    if (keyword.equalsIgnoreCase(word)) {
                        found = true;
                        doc.remove(start, end - start);
                        // 添加高亮属性集
                        SimpleAttributeSet set = new SimpleAttributeSet();
                        StyleConstants.setForeground(set, HIGHLIGHT_COLOR);
                        doc.insertString(start, keyword, set);
                        break;
                    }
                }
                // 对于其他单词,添加普通属性集
                if (!found) {
                    doc.remove(start, end - start);
                    SimpleAttributeSet set = new SimpleAttributeSet();
                    StyleConstants.setForeground(set, Color.BLACK);
                    doc.insertString(start, word, set);
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace(System.err);
        }
    }

    public static void main(String[] args) {
        new SQLEditor().setVisible(true);
    }

    private JTextPane          editorPane;
    private List<String>       KEYWORDS;
    private static final Color HIGHLIGHT_COLOR = Color.BLUE;
}
0 请登录后投票
   发表时间:2011-07-17  
skyyks0001 写道
对于这种高亮问题 建议使用给字符设置字符集的办法 同时使用JTextPane而不是JEditorPane
我写了个简单的:

import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.util.LinkedList;
import java.util.List;

import javax.swing.*;
import javax.swing.text.*;

public class SQLEditor extends JFrame {

    public SQLEditor() {
        super("SQL Editor");
        editorPane = new JTextPane();
        editorPane.addKeyListener(new KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent e) {
                highlight();
            }
        });
        this.add(new JScrollPane(editorPane));
        this.setSize(300, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        KEYWORDS = new LinkedList<String>();
        KEYWORDS.add("SELECT");
        KEYWORDS.add("FROM");
        KEYWORDS.add("WHERE");
        KEYWORDS.add("INSERT");
        KEYWORDS.add("DELETE");
        KEYWORDS.add("UPDATE");
    }

    private void highlight() {
        try {
            Document doc = editorPane.getDocument();
            //替换掉所有回车符(回车符会导致错位)
            String text = editorPane.getText().replace("\r", "");
            //分割为单词
            String[] words = text.split("\\s");
            int start = 0;
            int end = 0;

            for (String word : words) {
                start = text.indexOf(word, end);
                end = start + word.length();
                boolean found = false;
                // 匹配高亮关键字
                for (String keyword : KEYWORDS) {
                    if (keyword.equalsIgnoreCase(word)) {
                        found = true;
                        doc.remove(start, end - start);
                        // 添加高亮属性集
                        SimpleAttributeSet set = new SimpleAttributeSet();
                        StyleConstants.setForeground(set, HIGHLIGHT_COLOR);
                        doc.insertString(start, keyword, set);
                        break;
                    }
                }
                // 对于其他单词,添加普通属性集
                if (!found) {
                    doc.remove(start, end - start);
                    SimpleAttributeSet set = new SimpleAttributeSet();
                    StyleConstants.setForeground(set, Color.BLACK);
                    doc.insertString(start, word, set);
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace(System.err);
        }
    }

    public static void main(String[] args) {
        new SQLEditor().setVisible(true);
    }

    private JTextPane          editorPane;
    private List<String>       KEYWORDS;
    private static final Color HIGHLIGHT_COLOR = Color.BLUE;
}


不知道代码有没有测试过,我觉得使用复制,粘贴时会失效
0 请登录后投票
   发表时间:2011-07-18  
pywepe 写道
skyyks0001 写道
对于这种高亮问题 建议使用给字符设置字符集的办法 同时使用JTextPane而不是JEditorPane
我写了个简单的:

import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.util.LinkedList;
import java.util.List;

import javax.swing.*;
import javax.swing.text.*;

public class SQLEditor extends JFrame {

    public SQLEditor() {
        super("SQL Editor");
        editorPane = new JTextPane();
        editorPane.addKeyListener(new KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent e) {
                highlight();
            }
        });
        this.add(new JScrollPane(editorPane));
        this.setSize(300, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        KEYWORDS = new LinkedList<String>();
        KEYWORDS.add("SELECT");
        KEYWORDS.add("FROM");
        KEYWORDS.add("WHERE");
        KEYWORDS.add("INSERT");
        KEYWORDS.add("DELETE");
        KEYWORDS.add("UPDATE");
    }

    private void highlight() {
        try {
            Document doc = editorPane.getDocument();
            //替换掉所有回车符(回车符会导致错位)
            String text = editorPane.getText().replace("\r", "");
            //分割为单词
            String[] words = text.split("\\s");
            int start = 0;
            int end = 0;

            for (String word : words) {
                start = text.indexOf(word, end);
                end = start + word.length();
                boolean found = false;
                // 匹配高亮关键字
                for (String keyword : KEYWORDS) {
                    if (keyword.equalsIgnoreCase(word)) {
                        found = true;
                        doc.remove(start, end - start);
                        // 添加高亮属性集
                        SimpleAttributeSet set = new SimpleAttributeSet();
                        StyleConstants.setForeground(set, HIGHLIGHT_COLOR);
                        doc.insertString(start, keyword, set);
                        break;
                    }
                }
                // 对于其他单词,添加普通属性集
                if (!found) {
                    doc.remove(start, end - start);
                    SimpleAttributeSet set = new SimpleAttributeSet();
                    StyleConstants.setForeground(set, Color.BLACK);
                    doc.insertString(start, word, set);
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace(System.err);
        }
    }

    public static void main(String[] args) {
        new SQLEditor().setVisible(true);
    }

    private JTextPane          editorPane;
    private List<String>       KEYWORDS;
    private static final Color HIGHLIGHT_COLOR = Color.BLUE;
}


不知道代码有没有测试过,我觉得使用复制,粘贴时会失效

是有点问题,不过我觉得这种方式值得学习。问题是:写一条SQL以后,不能再在SELECT前面加入字符了。如在SELECT * FROM t 前加a,则会将a加入到SELECT后面。
0 请登录后投票
   发表时间:2011-07-18  
当时的确是没做测试 写得很匆忙
关于这个问题其实以前就有解决方案了:
http://topic.csdn.net/t/20030202/10/1403265.html
完全可以解决

你说的那个问题 我不太清楚是什么原因造成的
初步猜测是由于insert产生了新的element的原因吧
0 请登录后投票
   发表时间:2011-07-19  
不是所有的关键字都高亮了,只有一部分啊
0 请登录后投票
   发表时间:2011-07-19  
changyuxin 写道
不是所有的关键字都高亮了,只有一部分啊

那是因为没添加而已 这不是大问题 问题是如何实现这个技术
0 请登录后投票
   发表时间:2011-08-05  
editorPane.addKeyListener(new KeyAdapter() { 
            public void keyTyped(java.awt.event.KeyEvent e) { 
                highlight(); 
            } 
        }); 

我觉得应该在监听文档改变事件

之前有做过,基本实现了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics