DefaultHighlightPainter在JTextPane中保持移位

时间:2015-12-15 12:03:35

标签: java swing highlight jtextpane

我目前正在处理一个读取大文本的应用程序,并突出显示该文本中的特定子字符串。它有点工作......

但似乎(并且我不知道为什么)highligt每次突出显示字符串时都会继续移动。

public List<int[]> findString(String text) {        
    text = text.toLowerCase();

    List<int[]> highlightPositions = new ArrayList<int[]>();
    JTextPane pane = getTextPane();

    String paneText = pane.getText().toLowerCase();

    int end = 0;
    while (paneText.indexOf(text, end) != -1) {         

        int start = paneText.indexOf(text, end);
        end = start + text.length();        

        highlightPositions.add(new int[] {start, end});                 
    }

    try {
        highlight(highlightPositions);
    } catch (Exception ex) {
    }       
return null;
}

这是执行实际突出显示的代码

public void highlight(List<int[]> highlightPositions) throws BadLocationException {
    DefaultHighlighter.DefaultHighlightPainter highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);

    JTextPane textPane = getTextPane();     

    for (int[] position : highlightPositions) {
        System.out.println("Highlight: " + position[0] + " : " + position[1]);
        textPane.getHighlighter().addHighlight(position[0], position[1], highlightPainter);

    }
}

有谁知道如何解决这个问题?

编辑: 以下是我尝试突出显示“设备”一词时的外观。

Highlighting output

1 个答案:

答案 0 :(得分:2)

String paneText = pane.getText().toLowerCase();

请勿使用getText()getText()方法将返回带有平台的行尾字符串的字符串,在Windows的情况下为\r\n。但是,文档仅为EOL字符串存储\n,因此您对文档中每个额外行的偏移量不匹配。

解决方案是使用:

String paneText = pane.getDocument().getText().toLowerCase();

有关此问题的更多完整信息,请参阅Text and New Lines