Java PrintWriter到JTextArea,在调用的方法关闭之前不会显示任何内容

Java PrintWriter到JTextArea,在调用的方法关闭之前不会显示任何内容,java,swing,serial-port,jtextarea,printwriter,Java,Swing,Serial Port,Jtextarea,Printwriter,上下文:我正在以115.2 Kbaud的速度从串行端口读取数据。读取的数据是使用PrintWriter打印的,然后将其附加到JTextArea 一切都很好,但是JTextArea中的文本直到从串行端口向我的PrintWriter发送流的方法完成后才会出现。我希望它更接近实时显示,因为我有时会一次接收20-30 MB以上的文本,并且当程序执行时,文本的一般流程如何变化将是有价值的 我正在使用PrintWriter到JTextArea的方法。我认为解决方案可能与线程和PipedWriter/Pipe

上下文:我正在以115.2 Kbaud的速度从串行端口读取数据。读取的数据是使用PrintWriter打印的,然后将其附加到JTextArea

一切都很好,但是JTextArea中的文本直到从串行端口向我的PrintWriter发送流的方法完成后才会出现。我希望它更接近实时显示,因为我有时会一次接收20-30 MB以上的文本,并且当程序执行时,文本的一般流程如何变化将是有价值的

我正在使用PrintWriter到JTextArea的方法。我认为解决方案可能与线程和PipedWriter/PipedReader有关,但我为实现它所做的每一次尝试都失败了

谢谢你的帮助

//code calling method;  VerifierReader does not inherit from Reader 
//or any such class. it's wholly homegrown. I send it the PrintWriter 
//as out, telling it to output there


verifierInstance=new VerifierReader("COM3", verifierOutputLocString.getText());
verifierInstance.setSysOutWriter(out);
verifierInstance.readVerifierStream();

// and the relevant code from VerifierReader

public void setSysOutWriter (PrintWriter outWriter) {
        sysOutWriter=new PrintWriter(outWriter);            

    }
public void readVerifierStream() throws SerialPortException, 
InterruptedException{

    try{
        sysOutWriter.println("Listening for verifier...");
                    //sysOutWriter.flush();

        verifierPort.addEventListener(new verifierListener());

        lastReadTimer=System.currentTimeMillis();

        while(verifierPort.isOpened()) {

            Thread.sleep(1000);
            //System.out.println(timeOut);
            if( ((long)(System.currentTimeMillis()-lastReadTimer))>timeOut){
                sysOutWriter.println("Finished");
                verifierPort.removeEventListener();
                verifierPort.closePort();

            }
        }
    }

    finally {

        if (verifierPort.isOpened()) {
            verifierPort.closePort();
        }

        bfrFile.close();

    }
}








private class verifierListener implements SerialPortEventListener{

    String outBuffer;




    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR()){//If data is available
            timeOut=200;
            lastReadTimer=System.currentTimeMillis();
            if(event.getEventValue() > 0){//Check bytes count in the input buffer

                try {
                    byte[] buffer = verifierPort.readBytes(event.getEventValue());
                    outBuffer=new String(buffer);

                    bfrFile.print(outBuffer);
                    sysOutWriter.print(outBuffer);
                        //bfrFile.flush();
                        //sysOutWriter.flush();
                }
                catch (SerialPortException ex) {
                    sysOutWriter.println(ex);
                }

            }
        }



    }
}
编辑:

我尝试了下面的建议,并做了以下更改:

 private class VerifierTask extends SwingWorker<Void, String> {



    public VerifierTask() throws IOException, SerialPortException, InterruptedException{
        verifierInstance= new VerifierReader(streamReader);
        verifierInstance.setReaderIO("COM3", verifierOutputLocString.getText());
        verifierInstance.readVerifierStream();

    }


    @Override
    protected Void doInBackground() throws IOException{
        int charItem;
        char[] charBuff = new char[10];
        String passString;

        while ((charItem = streamReader.read(charBuff, 0, 10)) !=-1) {

            passString = new String(charBuff);
            publish(passString);
        }


        return null;
    }

    @Override 
    protected void process(List<String> outList) {

        for (String output : outList) {
            outputArea.append(output);
        }

    }



}
私有类验证任务扩展SwingWorker{
public VerifierTask()引发IOException、SerialPortException、InterruptedException{
verifierInstance=新的VerifierReader(streamReader);
verifierInstance.setReaderIO(“COM3”,VerifierOutputLocalString.getText());
verifierInstance.readVerifierStream();
}
@凌驾
受保护的Void doInBackground()引发IOException{
int charItem;
char[]charBuff=新字符[10];
字符串passString;
while((charItem=streamReader.read(charBuff,0,10))!=-1){
passString=新字符串(charBuff);
发布(passString);
}
返回null;
}
@凌驾
受保护的无效进程(列表大纲视图){
for(字符串输出:大纲视图){
outputrea.append(输出);
}
}
}
添加了,我更改了按钮以立即调用VerifierTask类的新实例,并使VerifierReader为输出实现一个PipedWriter(所有这些都是字符串)

我不确定我做错了什么。执行此代码时,Java进程将无限期冻结


我是否正确地假设在任何VerifierTask线程中创建的VerifierReader绑定到该线程,因此我的thread.sleep和while(true)语句不再构成问题?

不要在主Swing事件线程EDT上调用thread.sleep或do while(true)。曾经相反,在后台线程中执行此类操作,例如通过SwingWorker提供的线程。您可以使用publish/process方法对获取JTextArea的中间结果

有关这方面的更多信息,请查看教程: