我正在制作自己的脚本编辑器(在本例中为Arma: Cold War Assault),因为我想学习,这具有足够的挑战性。

让我解决这个问题:请不要告诉我我应该做些简单的事情。我还是想这样做。

因此,基本上,我现在有了一个简单的GUI,其中包含一个可以正常工作的new / open / save文件菜单。

我设法用不同的颜色突出显示某些单词(因为我想先解决最难的部分),但效率不高。

我已经针对算法提出了一些想法(并没有全部实现),但是我想知道您要做什么,如果有某种方法并且我做错了什么。

这一切都发生在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();
}


我将如何更有效地做到这一点?

最佳答案

这是一些代码:

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

看起来您想要“算法的理想”。因此,语言差异不应该太大。

关于java - 自定义脚本编辑器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17741145/

10-11 16:31