我目前正在处理一个读取大文本的应用程序,并突出显示该文本中的特定子字符串。它有点工作......
但似乎(并且我不知道为什么)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);
}
}
有谁知道如何解决这个问题?
编辑: 以下是我尝试突出显示“设备”一词时的外观。
答案 0 :(得分:2)
String paneText = pane.getText().toLowerCase();
请勿使用getText()
。 getText()
方法将返回带有平台的行尾字符串的字符串,在Windows的情况下为\r\n
。但是,文档仅为EOL字符串存储\n
,因此您对文档中每个额外行的偏移量不匹配。
解决方案是使用:
String paneText = pane.getDocument().getText().toLowerCase();
有关此问题的更多完整信息,请参阅Text and New Lines。