我有一個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