我有一个功能如下的线程:连续输入字符,这些字符存储在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的答案解决了这个问题。我忽略了这个事情,我先设置字符属性,然后插入数组。交换位置解决了问题。答案 0 :(得分:2)
我假设您使用StyledEditorKit
。
terminalArea.setText(dataToShow.toString());
代码只删除你所拥有的所有内容并将文本读入文档。事实上,在文档中remove(0, docLength)
被调用,然后insertString(theToStringResult)
替换了所有样式。
我建议您创建一个新的Document
实例,插入所有使用insertString()
设置样式的文本,您可以在其中传递属性(或只调用insertString()
一次,并且多次调用setCharacterAttributes()
)。 Document
实例准备就绪后,只需致电terminalArea.setDocument(theDocumentInstance);
而不是setText()
;