2011-10-03 66 views
1

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

+3

除了不是很清楚的代碼(並且是單例模式的一個不好的實現),我沒有看到任何阻止它作爲預期。從你發佈的片段中,我會說你阻止AWT調度線程的假設是不正確的。但最好的辦法是發佈一個編譯和工作代碼片段,以顯示您遇到的實際問題。 – jfpoilpret

+1

此外,我並不是系統地追加到textarea,而是建議緩存(到ThreadLocal)所有書面內容,直到接收到'\ n',緩衝區可以追加到textarea的時間。 – jfpoilpret

回答