使用Java Highlighter突出显示多个匹配

时间:2016-02-16 16:22:07

标签: java swing highlight

我正试图让我的荧光笔突出显示正则表达式的所有匹配。我的正则表达式正常工作,并为荧光笔提供正确的开始和结束。然而,高层人士继续强调后续文本。见附图。

enter image description here

    class CommandAreaDocumentListener implements DocumentListener {

    Pattern variables
            = java.util.regex.Pattern.compile("(?<variable>\\$\\w*\\$)");

    @Override
    public void insertUpdate(DocumentEvent e) {
        // System.out.println(commandArea.getText());
        validate(commandArea.getText());

    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        // System.out.println(commandArea.getText());
        validate(commandArea.getText());
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        //  System.out.println(commandArea.getText());
        validate(commandArea.getText());
    }

    private void validate(String s) {
        Matcher matcher = variables.matcher(s);
        SwingUtilities.invokeLater(new HighlighterRunnable(matcher));

    }

    class HighlighterRunnable implements Runnable {

        Matcher matcher;

        public HighlighterRunnable(Matcher m) {
            this.matcher = m;

        }

        @Override
        public void run() {
            // System.out.println("Running!");
            while (matcher.find()) {
                for (int i = 0; i < matcher.groupCount() + 1; i++) {

                    try {
                        // commandArea.append("\nGroup #" + i + ": " + matcher.group(i));
                        // commandArea.append(" , " + matcher.end(i));
                        int start = matcher.start(i);
                        int end = matcher.end(i);
                        commandArea.getHighlighter().addHighlight(start, end, DefaultHighlighter.DefaultPainter);

                        //  if (matchCount == 1) inputArea.setCaretPosition(start);
                    } catch (BadLocationException ex) {
                        Logger.getLogger(CommandPanel.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }

            }

        }
    }
}

1 个答案:

答案 0 :(得分:0)

不确定为什么我必须这样做,但在“run()”中创建一个新的DefaultHighlighter解决了这个问题。不确定其他人是如何看到我的代码不同的结果。这是修复:

            @Override
        public void run() {
            // System.out.println("Running!");
            commandArea.setHighlighter(new DefaultHighlighter());
            while (matcher.find()) {
                for (int i = 0; i < matcher.groupCount() + 1; i++) {
                    try {
                        int start = matcher.start(i);
                        int end = matcher.end(i);
                        System.out.println("start=" + start + " end=" + end);
                        commandArea.getHighlighter().addHighlight(start, end, new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN));
                    } catch (BadLocationException ex) {
                        Logger.getLogger(CommandPanel.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }

            }

        }