【问题标题】:DefaultHighlightPainter keeps shifting in JTextPaneDefaultHighlightPainter 在 JTextPane 中不断变化
【发布时间】:2016-03-21 05:13:52
【问题描述】:

我目前正在开发一个读取大文本并突出显示该文本中的特定子字符串的应用程序。而且还挺有效的……

但似乎(我不知道为什么)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

【问题讨论】:

  • “highligt 不断变化”是什么意思?此外,当我尝试重现此内容时,它对我有用 - 请考虑提供可运行的 minimal reproducible example
  • 我刚刚用一张图片更新了我的帖子。这就是我尝试突出显示“设备”一词时的样子。

标签: java swing highlight jtextpane


【解决方案1】:
String paneText = pane.getText().toLowerCase();

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

解决方法是使用:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多