我有这个JList
,我用它作为System.out
的显示。我在JFrame
的底部创建了一个IRC客户端,它的这个JList
。似乎每当将两个或更多个元素同时添加到JLists
ListModel
时,整个JList
变成白色并且是非交互式的,直到单独添加一个元素为止。当一个异常打印堆栈跟踪时,会同时添加多个元素的示例。JList空白[我认为OutputStream Buffering问题]
这里是OutputStream
类我有被设置为System.out
...
public class LogOutputStream extends OutputStream {
String sentence = "";
boolean writing = false;
private DefaultListModel subject;
public LogOutputStream(DefaultListModel logListModel) {
this.subject = logListModel;
}
public void write(final int b) {
try {
sentence = sentence + (char) b;
if (sentence.endsWith("\n") && !sentence.isEmpty() && !sentence.equals("\t") && !sentence.equals("\r\n") && !sentence.equals("\n")) {
if (writing == false) {
writing = true;
subject.addElement(sentence.replaceAll("\n", "").replaceAll("\r", "").trim());
}
sentence = "";
writing = false;
}
}
catch (Exception e) {
e.printStackTrace(Boot.stdErr);
}
}
}
有谁知道是怎么回事,它如何能解决吗?
使用[synchronized](http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html)而不是使用书写进行阻止。 –
我不明白*任何事情。*请澄清。输出流缓冲如何在不使用输出流的方法中执行任何操作?一个字符串如何以换行符结尾并同时为空? – EJP
@EJP这个类通过“System.setOut(new PrintStream(new LogOutputStream()));”代替System.out。目的是让我可以有一个自定义控制台进行日志记录。但是,当多行事件(如异常)打印其堆栈跟踪时,会阻塞它或导致JList停止显示当前任何元素。此外,它会检查字符串是否为空,然后检查它是否以换行符结束。 – injectv