2011-10-03 72 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

回答