我有一个JScrollPane(与文本区域打包),充当我的swing应用程序的自定义控制台。这里是(使用后端的println/lo4j)对我的控制台如何使用线程同步重绘自定义控制台?
class InternalConsoleFrame{
static JTextArea outArea
static JScrollPane consoleHolder
static setUpStreams(){
outArea = new javax.swing.JTextArea(10,100)
System.setErr(new PrintStream(new JTextAreaOutputStream(outArea)));
System.setOut(new PrintStream(new JTextAreaOutputStream(outArea)));
WriterAppender logAppender = new WriterAppender(new PatternLayout(), new JTextAreaOutputStream(outArea));
Logger.getRootLogger().addAppender(logAppender);
}
public InternalConsoleFrame(){
DefaultCaret caret = (DefaultCaret)outArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);
outArea.setBackground(new Color(255,250,205));
outArea.setForeground(Color.BLACK);
outArea.setLineWrap(true);
outArea.setWrapStyleWord(true);
outArea.setFont(new Font(null, Font.PLAIN, 13));
outArea.addMouseListener(new ConsolePopup());
consoleHolder = new JScrollPane(outArea);
}
}
public class JTextAreaOutputStream extends OutputStream {
JTextArea ta;
JTextAreaOutputStream(javax.swing.JTextArea t) {
super();
ta = t;
}
public synchronized void write(int i) {
ta.append(Character.toString((char)i));
}
public synchronized void write(char[] buf, int off, int len) {
String s = new String(buf, off, len);
ta.append(s);
}
}
在后端的API服务器连续打印状态的代码,但我的自定义控制台不能同步捕获的log4j /打印报表和重绘本身。
它只在完成API调用后才从后端删除整组log4j语句。我希望我的控制台捕获后端log4j/println语句在API调用和重绘本身。这怎么能实现?
我的猜测是创建的InternalConsoleFrame()对象被原生swing awt线程阻塞,直到完成API调用。如果是这种情况,我认为我需要启动上面的代码片段到一个新的线程上。如果是这样,上面的代码的哪一部分应该实现线程化。我很confused..Please帮助..
除了不是很清楚的代码(并且是单例模式的一个不好的实现),我没有看到任何阻止它作为预期。从你发布的片段中,我会说你阻止AWT调度线程的假设是不正确的。但最好的办法是发布一个编译和工作代码片段,以显示您遇到的实际问题。 – jfpoilpret
此外,我并不是系统地追加到textarea,而是建议缓存(到ThreadLocal)所有书面内容,直到接收到'\ n',缓冲区可以追加到textarea的时间。 – jfpoilpret