Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java Highlighter高亮显示多个匹配项_Java_Swing_Highlight - Fatal编程技术网

使用Java Highlighter高亮显示多个匹配项

使用Java Highlighter高亮显示多个匹配项,java,swing,highlight,Java,Swing,Highlight,我想让我的荧光笔在正则表达式中突出显示所有匹配项。我的正则表达式工作正常,为荧光灯提供了正确的开始和结束。然而,Highlighter继续突出显示后续文本。见附图 class CommandAreaDocumentListener实现DocumentListener{ 模式变量 =java.util.regex.Pattern.compile((?\\$\\w*\\$); @凌驾 公共作废插入更新(文档事件e){ //System.out.println(commandArea.getText

我想让我的荧光笔在正则表达式中突出显示所有匹配项。我的正则表达式工作正常,为荧光灯提供了正确的开始和结束。然而,Highlighter继续突出显示后续文本。见附图

class CommandAreaDocumentListener实现DocumentListener{
模式变量
=java.util.regex.Pattern.compile((?\\$\\w*\\$);
@凌驾
公共作废插入更新(文档事件e){
//System.out.println(commandArea.getText());
验证(commandArea.getText());
}
@凌驾
公共作废移除更新(文档事件e){
//System.out.println(commandArea.getText());
验证(commandArea.getText());
}
@凌驾
公共作废更改日期(记录事件e){
//System.out.println(commandArea.getText());
验证(commandArea.getText());
}
私有void验证(字符串s){
Matcher Matcher=变量。Matcher(s);
调用器(新的HighlighterRunnable(matcher));
}
类HighlighterRunnable实现可运行{
匹配器匹配器;
公共高亮灯不可命名(匹配器m){
this.matcher=m;
}
@凌驾
公开募捐{
//System.out.println(“Running!”);
while(matcher.find()){
对于(int i=0;i
我不确定为什么要这样做,但在“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);
                    }
                }

            }

        }
@覆盖
公开募捐{
//System.out.println(“Running!”);
setHighlighter(新的DefaultHighlighter());
while(matcher.find()){
对于(int i=0;i
DefaultHighlighter。DefaultPainter
是相同的颜色。您必须扩展该功能并覆盖
绘制(图形g)
,以更改颜色扫描不再现。使用正则表达式和循环高亮显示,高亮显示效果很好,即使之后更改/插入文本也是如此。但是,即使在中间添加空格,高亮显示仍会保留在
$…$
周围。你做过这样的事吗?在添加新的突出显示之前,您是否尝试过调用
removeAllHighlights()
?我的在第一次匹配后突出显示所有内容。例如,hello“$world$hello”突出显示$world$之后的所有内容您应该从DefaultHighlighter数组中删除所有DefaultHighlighter您是否尝试过
commandArea.getHighlighter().removeAllHighlights()
是否具有相同的效果?在哪里以及为什么?据我所知,开始和结束应该告诉荧光灯从哪里开始和结束。我仍然不知道为什么创建一个新的HighLigher会奏效。请看我在您的问题下的评论。我的理论是,一些“旧”的亮点仍然存在,因此一切都突出了。执行
removeAllHighlights()
而不是
setHighlighter(新的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);
                    }
                }

            }

        }