Java jtextpane仅高亮显示第一个实例

Java jtextpane仅高亮显示第一个实例,java,swing,for-loop,Java,Swing,For Loop,我试图突出显示jtextpane中的多个单词。但是,我只能突出显示找到的第一个实例 String key = "are"; Highlighter h = test.outputPane.getHighlighter(); String text = test.outputPane.getText(); String arr[] = text.split("[\\p{Punct}\\s]+"); for (int i = 0; i < arr.length; i++) { Stri

我试图突出显示jtextpane中的多个单词。但是,我只能突出显示找到的第一个实例

String key = "are";
Highlighter h = test.outputPane.getHighlighter();
String text = test.outputPane.getText();
String arr[] = text.split("[\\p{Punct}\\s]+");
for (int i = 0; i < arr.length; i++) {
    String temp = arr[i];
    if (temp.equals(key)) {
        try {
            h.addHighlight(text.indexOf(temp), text.indexOf(temp) + temp.length(), DefaultHighlighter.DefaultPainter);
        } catch (BadLocationException ex) {
            Logger.getLogger(crawler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
String key=“are”;
Highlighter h=test.outputPane.getHighlighter();
String text=test.outputPane.getText();
字符串arr[]=text.split([\\p{Punct}\\s]+”;
对于(int i=0;i
h.addHighlight(text.indexOf(temp),text.indexOf(temp)+temp.length(),DefaultHighlighter.DefaultPainter)将始终突出显示文本中第一次出现的临时值。由于temp等于您的搜索键,它将只突出显示您的搜索键的第一次出现

您需要改进您的迭代代码…

问题是只“返回指定子字符串第一次出现的字符串中的索引”。您可以使用,它还将“从指定的索引开始”

例如:

import javax.swing.*;
import java.awt.event.*;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.border.LineBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;

public class Example {

    JTextPane textPane;

    public Example() {
        JFrame frame = new JFrame();
        textPane = new JTextPane();
        textPane.setText("are warehouse are arearea are rare");
        hightlightAll("are");
        frame.setContentPane(textPane);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private void hightlightAll(String word) {
        Highlighter highlighter = textPane.getHighlighter();
        String text = textPane.getText();
        String[] words = text.split("[\\p{Punct}\\s]+");
        int lastIndex = 0;
        for (String str : words) {
            lastIndex = text.indexOf(str, lastIndex);
            int endIndex = lastIndex + str.length();
            if (str.equals(word)) {
                try {
                    highlighter.addHighlight(lastIndex, endIndex, DefaultHighlighter.DefaultPainter);
                } catch (BadLocationException e) {

                }
            }
            lastIndex = endIndex;
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }
}

你好请提供一份报告。这不足以重现问题。感谢您的回复。根据您的输入,我注意到它在第一个实例之后停止循环。非常感谢。我会调查的。@LuxxMiner的解决方案的问题是,它也会突出“仓库”中的“是”。@ThomasKläger谢谢你指出这一点,我更新了我的答案。嗨,谢谢。在参考了您的解释后,我得到了这部分内容。@kenAu89我编辑了代码,现在它应该只突出显示“are”一词,而不是“ravel”中的“are”