0

私は自分自身のスクリプト エディタ(この場合は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();
}

これをより効率的に行うにはどうすればよいですか?

画像

4

1 に答える 1

1

ここにいくつかのコードがあります:

http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting

「[an] アルゴリズムのアイデア」が必要なようです。したがって、言語の違いはそれほど重要ではありません。

于 2013-07-19T08:18:35.113 に答える