【问题标题】:Custom Script Editor自定义脚本编辑器
【发布时间】:2013-07-19 08:09:52
【问题描述】:

我正在制作自己的脚本编辑器(在本例中为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();
}

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

【问题讨论】:

  • 如果您正在寻找某人来审查您的代码(以提高效率),您可能想尝试Code Review。如果您正在寻找其他东西,您必须澄清。
  • 谢谢。我不知道那个网页。我已经在那里提交了我的代码。

标签: java string performance syntax


【解决方案1】:

这里有一些代码:

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

您似乎想要“用于 [an] 算法的想法 [s]。”因此,语言的差异应该没有多大关系。

【讨论】:

  • 谢谢。我会研究一下,但是 JAVA 有太多的类可以做很多不同的事情,以至于我迷路了。我认为字符串阅读有 3 或 4 个类。这很令人困惑。我正在尝试将 hashCodes 而不是字符串与字符串进行比较,但我不知道如何从文本中获取 hashCode 并且知道该词出现的位置。我什至不知道我是否正确地为文字着色!我只是使用了一个从这里的另一个答案中得到的例子。也许有更好的方法。
猜你喜欢
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
相关资源
最近更新 更多