【问题标题】:jtextpane highlight only highlight first instancejtextpane highlight 仅突出显示第一个实例
【发布时间】:2015-12-09 13:47:19
【问题描述】:

我试图在 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);
        }
    }
}

【问题讨论】:

  • 嗨。请提供MCVE。这段代码不足以重现问题。

标签: java swing for-loop


【解决方案1】:

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

例如:

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

【讨论】:

  • 嗨,谢谢。参考您的解释后,我得到了部分工作。
  • @kenAu89 我编辑了代码,现在它应该只突出“are”这个词,而不是“rare”中的“are”
【解决方案2】:

h.addHighlight(text.indexOf(temp), text.indexOf(temp) + temp.length(), DefaultHighlighter.DefaultPainter); 将始终突出显示文本中第一次出现的 temp。由于 temp 等于您的搜索键,它只会突出显示您的搜索键的第一次出现。

您需要改进迭代代码...

【讨论】:

  • 感谢您的回复。根据您的输入,我注意到它在第一个实例之后停止循环。谢谢你。我会调查的。
  • @LuxxMiner 解决方案的问题在于它还会突出显示“仓库”中的“是”。
  • @ThomasKläger 感谢您指出这一点,我更新了我的答案。
猜你喜欢
  • 2013-10-10
  • 2013-11-14
  • 2011-08-06
  • 1970-01-01
  • 2016-08-17
  • 2012-05-15
  • 1970-01-01
  • 2014-10-21
  • 2014-09-12
相关资源
最近更新 更多