JTextPane仅在第一行

时间:2017-01-29 09:59:33

标签: java swing

我正在用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” 提前谢谢!

1 个答案:

答案 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));