我正在创建自己的脚本编辑器(在本例中为Arma: Cold War Assault
),因为我想学习,这很有挑战性。
让我解决这个问题: 请不要告诉我,我应该做更容易的事情。无论如何,我想这样做 。
所以,基本上我现在有一个简单的GUI,有一个工作的新/打开/保存文件菜单。
我设法突出显示不同颜色的某些单词(因为我想首先处理最难的部分)但是效率不高。
我已经提出了几个算法的想法(没有全部实现),但我想知道你是什么,如果有某种方式,我做错了什么。
这一切都发生在JTextPane
类中。
包含保留字的数组:
Collections.addAll(keywords, "private", "public", "if", "not", "then", "else", "else if");
Collections.addAll(operators, "+", "-", "=", "==", "?", "!","(", ")","{", "}", "_", "-", "^", "<", ">");
ArrayList<String> keywords = new ArrayList<String>();
ArrayList<String> operators = new ArrayList<String>();
每次用户对文档进行更新时,都会更新:
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
当用户停止输入时,它会等待500毫秒来更新屏幕:
Timer t;
/**
* Updates the text when user stops typing
*/
public void update(){
if (t != null) {
if (t.isRunning())
t.stop();
}
t = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long start = System.currentTimeMillis();
String text = getText();
int length = text.length();
SimpleAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setForeground(attrs, Color.BLACK);
StyledDocument doc = getStyledDocument();
doc.setCharacterAttributes(0, length, attrs, true);
int c = 0, carriage = 0;
while ( (c < length ) ){
if(text.codePointAt(c) == 10){
carriage += 1;
}
for (String s : keywords) {
if (text.startsWith(s, c)) {
StyleConstants.setForeground(attrs, Color.blue);
doc.setCharacterAttributes(
c - carriage, s.length(), attrs, false);
}
}
for (String s : operators) {
if (text.startsWith(s, c)) {
StyleConstants.setForeground(attrs, Color.red);
doc.setCharacterAttributes(
c - carriage, s.length(), attrs, false);
}
}
c++;
}
System.out.println("Iterations took: " + (System.currentTimeMillis() - start) + " ms");
t.stop();
}
});
t.start();
}
我如何更有效地做到这一点?
答案 0 :(得分:1)
以下是一些代码:
http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting
看起来你想要[an]算法的想法。因此,语言的差异不应该太大。