我有几个JScrollPane
,每个JTextArea
包含一个JTextArea
。 ScheduledExecutorService
填充了一系列不断更新的变量。
我有一个JTextArea
,它会不断清除JScrollPan
并替换变量。对于大多数JScrollPane
es而言,更改非常无缝,看起来列表中包含的数字会以平滑的方式发生变化。
有一个JScrollPane
提出了问题。它将不断发出闪光(文本区域和滚动条变为空白并重新出现),这与重新绘制相关(我应该注意,即使其他窗格以完全相同的方式更新,它们也不会遇到此问题)。滚动条也会疯狂滚动(回到顶部);总而言之看起来非常凌乱。这个特殊的JScrollPane
也是最长的,所以我认为这就是原因。这个特定的窗格与其他窗格没有任何不同。
除非有人有更好的解决方案,否则我认为我最好的选择是将Caret设置为 NEVER_UPDATE ,但为了实现这一点,{{1}即使我将所有文本都清空,也必须保持相同的大小。
有谁知道怎么做?为了澄清,我不想让窗格变大,我希望基本上能够向下滚动到设定的长度,即使窗格是空的。
答案 0 :(得分:2)
我不确定这是否是您正在寻找的内容,但在过去,我创建了一个不断更新的JTextPane,其中包含每种颜色编码的异常消息。它有一个滚动窗格和一个文本大小缓冲区,所以当它到达时,它将从头开始删除附加到末尾的文本量。
每当我发现异常时,我就跑了:
printExceptionMessage(new TCException(ex));
反过来:
protected void printExceptionMessage(final TCException exception) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
Date recordDate = exception.getTimeStamp();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss z");
String recordTime = sdf.format(recordDate);
String message = "(" + recordTime + ") EXCEPTION: " + exception.getMessage() + "\n";
statusColorTextPane.setEditable(true);
// trim the textPane to the buffer size
Document doc = statusColorTextPane.getStyledDocument();
int overLength = doc.getLength() + message.length() - Foo.TEXT_BUFFER_SIZE;
if (overLength > 0) {
try {
doc.remove(0, overLength);
} catch (Exception ex) {
System.err.println("Error occured while trimming the textPane.");
ex.printStackTrace();
}
}
statusColorTextPane.append(Color.red, message);
statusColorTextPane.setEditable(false);
}
});
}
在这种情况下,statusColorTextPane是JTextPane的扩展类。它需要这两种方法:
public void appendNaive(Color c, String s) { // naive implementation
SimpleAttributeSet aset = new SimpleAttributeSet();
StyleConstants.setForeground(aset, c);
int len = getText().length();
setCaretPosition(len); // place caret at the end (with no selection)
setCharacterAttributes(aset, false);
replaceSelection(s); // there is no selection, so inserts at caret
}
和
public void append(Color c, String s) { // better implementation--uses StyleContext
StyleContext sc = StyleContext.getDefaultStyleContext();
AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY,
StyleConstants.Foreground, c);
int len = getDocument().getLength(); // same value as getText().length();
setCaretPosition(len); // place caret at the end (with no selection)
setCharacterAttributes(aset, false);
replaceSelection(s); // there is no selection, so inserts at caret
}
Foo.TEXT_BUFFER_SIZE对我来说我已经设置为20000。