java - jtextpane 突出显示仅突出显示第一个实例

标签 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++) {
    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);
        }
    }
}

最佳答案

问题是 text.indexOf(String)“返回指定子字符串在该字符串中第一次出现的索引。”。您可以使用 text.indexOf(String, int) ,它也会“从指定的索引开始。”

enter image description here

例如:

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();
            }
        });
    }
}

关于java - jtextpane 突出显示仅突出显示第一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34180401/

相关文章:

java - 在封闭范围内定义的局部变量 i 必须是最终的或实际上是最终的

java - Android 上的 DriverManager.getConnection() 出现 UnsupportedOperationException

Java MySQL 查询比预期慢

java - JScrollPane 获取/设置值

java - 用户发起事件的最后时间

java - 有人可以帮助我了解 ImageIcon 在 java 中的工作原理吗?

java - 无法实现内部 "for"循环

java - 计算代码行数 - 质量指标

Java EE7 : @DatasourceDefinition, 如何参数化值?

javascript使用for循环从多个字符串中删除字符