私は自分自身のスクリプト エディタ(この場合は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();
}
これをより効率的に行うにはどうすればよいですか?