我正在用Java编写文本编辑器用于培训目的。因此,我使用JTextPane编辑文本,使用setCharacterAttributes来突出显示文本中的某些单词。代码部分工作,在第一行中一切正常,但在第二行和第四行中代码停止工作。下面的代码显示我尝试修复此错误:
private void changeColor(StyledDocument styledDocument) { String keywords[] = {"html", "body", "div", "teste"}; String texto = edtEditing.getText(); int startIndex; int start; StyleContext context = StyleContext.getDefaultStyleContext(); Style styleDefault = context.getStyle(StyleContext.DEFAULT_STYLE); // default styledDocument.setCharacterAttributes(0, texto.length(), styleDefault, true); AttributeSet attr = context.addAttribute(context.getEmptySet(), StyleConstants.Foreground, Color.red); for (String word:keywords) { startIndex = 0; start = texto.indexOf(word, startIndex); while (start >= 0) { styledDocument.setCharacterAttributes(start, word.length(), attr, true); startIndex += word.length(); start = texto.indexOf(word, startIndex); } } }
请参阅下图中的错误: Click to see the error
错误似乎是因为CRLF而发生,但我无法弄清楚为什么......
这是executable jar file。只需选择File-> New并输入“teste” 提前谢谢!
答案 0 :(得分:1)
这种副作用是由这一行引起的:
String texto = edtEditing.getText();
您直接从JTextPane
收到文字,但是您要在StyledDocument
对象上设置属性。将此行更改为:
StyledDocument document = edtEditing.getStyledDocument();
String texto = document.getText(0, document.getLength());
并处理可能的异常。
您可以运行以下代码以查看此行为是否一致,并且与人们预期的相反,将打印“false”。
JTextPane pane = new JTextPane();
pane.setText("Something html\r\nSomething html");
StyledDocument document = pane.getStyledDocument();
String text2 = pane.getText();
String text1 = document.getText(0, document.getLength());
System.out.println(text1.equals(text2));