JTextPane在显示文本后丢失样式

时间:2014-05-08 06:21:15

标签: java swing jtextpane

我有一个功能如下的线程:连续输入字符,这些字符存储在StringBuilder中。需要根据某些代码对此字符串构建器的内容进行样式设置。当字符附加在字符串构建器中时,我有一个循环将其拆分为字符串数组,并进行一些处理。这里很小(但本身处理完整):

SimpleAttributeSet set = new SimpleAttributeSet();

if(string.contains(code1)){ 
    str = string;               
    int index = string.indexOf(code1); 
    string = string.replaceAll(code1, "");
    StyleConstants.setForeground(set, Color.GREEN);

    // data is a another variable of string builder
    data.append(string);
    i = sb.indexOf(string);

    String st = string.substring(index); 

    doc.setCharacterAttributes(data.indexOf(st), st.length(), set, true);
}

//similarly there are checks and styling for other codes

//terminalArea is of JTextPane type
terminalArea.setText(dataToShow.toString());

文本根据代码正确着色,但是当显示数据时,颜色会立即显示,然后丢失。之后,当按下某个键时,颜色会再次出现,但是当键被释放时,它们会丢失。

我试过了terminalArea.repaint(),但没有任何反应。

更新 关于StanislavL的回答,这就是我现在所拥有的:

doc = new DefaultStyledDocument();
if(string.contains(code)){
        str = string;
        int index = string.indexOf(code); 
        string = string.replaceAll(code, "");
        StyleConstants.setForeground(set, Color.GREEN);
        dataToShow.append(string);
        i = sb.indexOf(string);
        String st = string.substring(index); 
        doc.setCharacterAttributes(dataToShow.indexOf(st), st.length(), set, true);
        doc.insertString(doc.getLength() , string, null);


        }
//after all conditions
terminalArea.setDocument(doc);

虽然颜色仍然存在,但只有该文字显示为彩色,最后是彩色的。之前的那些以白色显示。请注意,整个字符串没有着色,只有一部分是彩色的。

解决:

StanislavL的答案解决了这个问题。我忽略了这个事情,我先设置字符属性,然后插入数组。交换位置解决了问题。

1 个答案:

答案 0 :(得分:2)

我假设您使用StyledEditorKit

terminalArea.setText(dataToShow.toString());

代码只删除你所拥有的所有内容并将文本读入文档。事实上,在文档中remove(0, docLength)被调用,然后insertString(theToStringResult)替换了所有样式。

我建议您创建一个新的Document实例,插入所有使用insertString()设置样式的文本,您可以在其中传递属性(或只调用insertString()一次,并且多次调用setCharacterAttributes())。 Document实例准备就绪后,只需致电terminalArea.setDocument(theDocumentInstance);而不是setText();