浏览 4083 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-17
现在有些困惑的是字符数组复制,每次画一行字符的时候都要从MODEL里将数据复制出来,而且在调试过程中,发现swing会重复执行一些代码-比如,JEditor在构建的时候,就会执行创建Document,Content这些对象,做为默认的对象,但在我设置了EditorKit后,它又要重新执行一下那些代码路径,比如分配数组空间之类的。我想如果能有一个构建方法直接将我的EditorKit传进去,就执行一次。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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; } |
|
返回顶楼 | |
发表时间: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; } 不知道代码有没有测试过,我觉得使用复制,粘贴时会失效 |
|
返回顶楼 | |
发表时间: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后面。 |
|
返回顶楼 | |
发表时间:2011-07-18
当时的确是没做测试 写得很匆忙
关于这个问题其实以前就有解决方案了: http://topic.csdn.net/t/20030202/10/1403265.html 完全可以解决 你说的那个问题 我不太清楚是什么原因造成的 初步猜测是由于insert产生了新的element的原因吧 |
|
返回顶楼 | |
发表时间:2011-07-19
不是所有的关键字都高亮了,只有一部分啊
|
|
返回顶楼 | |
发表时间:2011-07-19
changyuxin 写道 不是所有的关键字都高亮了,只有一部分啊 那是因为没添加而已 这不是大问题 问题是如何实现这个技术 |
|
返回顶楼 | |
发表时间:2011-08-05
editorPane.addKeyListener(new KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent e) { highlight(); } }); 我觉得应该在监听文档改变事件 之前有做过,基本实现了 |
|
返回顶楼 | |