JTextPane 语法突出显示偏移量不正确

JTextPane Syntax Highlighting Offsets Are Incorrect

我正在使用 JTextPane 在 Java 中创建带有语法高亮显示的文本编辑器。当我 运行 程序时,我得到这个输出: https://www.dropbox.com/s/kkce9xvtriujizy/Output.JPG?dl=0

我希望每个 HTML 标签都突出显示为粉红色,但在几个标签之后它开始突出显示错误的区域。

这里是高亮代码:

    private void htmlHighlight() {
    String textToScan;
        textToScan = txtrEdit.getText();
        StyledDocument doc = txtrEdit.getStyledDocument(); 
        SimpleAttributeSet sas = new SimpleAttributeSet();
        while(textToScan.contains(">")) {
            StyleConstants.setForeground(sas, new Color(0xEB13B1));
            StyleConstants.setBold(sas, true);
            doc.setCharacterAttributes(textToScan.indexOf('<'), textToScan.indexOf('>'), sas, false);
            StyleConstants.setForeground(sas, Color.BLACK);
            StyleConstants.setBold(sas, false);
            textToScan = textToScan.substring(textToScan.indexOf('>') + 1, textToScan.length());
        }

}

提前致谢!

setCharacterAttributes 的第二个参数是长度,不是结束索引。

这给了我们:

    private void htmlHighlight() {
    String textToScan;
        textToScan = txtrEdit.getText();
        StyledDocument doc = txtrEdit.getStyledDocument(); 
        SimpleAttributeSet sas = new SimpleAttributeSet();
        while(textToScan.contains(">")) {
            StyleConstants.setForeground(sas, new Color(0xEB13B1));
            StyleConstants.setBold(sas, true);
            int start = textToScan.indexOf('<');
            int end = textToScan.indexOf('>')+1;
            doc.setCharacterAttributes(start, end-start, sas, false);
            textToScan = textToScan.substring(textToScan.indexOf('>') + 1, textToScan.length());
        }

}

更新:

子字符串有问题,但没有它,仍然存在偏移量,可能是由于行尾。所以我找到的唯一解决方案是重新创建一个新文档:

try {
    String textToScan;
    textToScan = txtrEdit.getText();
    StyledDocument doc = new DefaultStyledDocument();
    SimpleAttributeSet sas = new SimpleAttributeSet();
    StyleConstants.setForeground(sas, new Color(0xEB13B1));
    StyleConstants.setBold(sas, true);
    int end = 0;
    while (true) {
        int start = textToScan.indexOf('<', end);
        if (start < 0) {
            doc.insertString(end, textToScan.substring(end), null);
            break;
        }
        doc.insertString(end, textToScan.substring(end, start), null);
        end = textToScan.indexOf('>', start+1);
        if (end < 0) {
            doc.insertString(start, textToScan.substring(start), sas);
            break;
        }
        ++end;
        doc.insertString(start, textToScan.substring(start, end), sas);
    }
    txtrEdit.setStyledDocument(doc);
} catch (BadLocationException ex) {
    Logger.getLogger(MyDialog.class.getName()).log(Level.SEVERE, null, ex);
}