java - JTextPane 在文本显示后丢失样式

标签 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 的回答解决了这个问题。我忽略了这一点,我首先设置字符属性,然后插入数组。交换一下位置就解决了问题。

最佳答案

我假设您使用StyledEditorKit

terminalArea.setText(dataToShow.toString());

该代码只是删除您拥有的所有内容并将文本重新添加到文档中。事实上,在文档中调用了 remove(0, docLength),然后 insertString(theToStringResult) 替换了所有样式。

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

关于java - JTextPane 在文本显示后丢失样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23534184/

相关文章:

java - JTable + 排序特定字段

java - 如何使用 TableHeader 渲染器

java - 使用 javax.swing.text.StyledDocument 在 <span> 内获取 title 属性

java - 在 Java 中将排序数组重写为 JTextPane

java - 如何添加新的 SSL 连接 Spring Boot jks cacerts

java - 如何创建十六进制补码?

Java += 运算符?

java - 不同机器上的字体及其大小

java - 如何在 JTextPane 中围绕组件包装文本?

java - MPAndroidChart 如何获取三次折线图上所有点的列表