简体   繁体   English

为什么没有实时输出到JTextArea?

[英]Why Output to JTextArea in real-time doesn't show up?

I use JTextArea to show status of unzipping file. 我使用JTextArea显示解压缩文件的状态。 But for a reason it does not display the appended text. 但是由于某种原因,它不显示附加的文本。 Can any one suggest a solution? 有人可以提出解决方案吗?

public class UnzipFile extends Thread{
private static FtpTabPanel panel;
private File archive,outputDir;

public UnzipFile(File archive, File outputDir, FtpTabPanel panel) {
    UnzipFile.panel = panel;
    this.archive = archive;
    this.outputDir = outputDir;
}

@Override
public void run() {
    super.run();
    unzipArchive();
}

public void unzipArchive() {
    try {
        ZipFile zipfile = new ZipFile(archive);
        for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            unzipEntry(zipfile, entry, outputDir);
        }
        panel.statusTextArea.append(String.valueOf(System.currentTimeMillis()));

    } catch (Exception e) {
        OeExceptionDialog.show(e);
    }
}

private void unzipEntry(ZipFile zipfile, final ZipEntry entry, File outputDir)  {
    if (entry.isDirectory()) {
        createDir(new File(outputDir, entry.getName()));
        return;
    }

    File outputFile = new File(outputDir, entry.getName());
    if (!outputFile.getParentFile().exists()){
        createDir(outputFile.getParentFile());
    }

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            panel.statusTextArea.append("Extracting: " + entry + "\n");
        }
    });

    try {
    BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
    BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));
    IOUtils.copy(inputStream, outputStream);
    outputStream.close();
    inputStream.close();    
    }catch (IOException io){
        OeExceptionDialog.show(io);
    }catch (NullPointerException n){
        OeExceptionDialog.show(n);
    }catch (ArithmeticException a){
        OeExceptionDialog.show(a);
    }
}
}

In the below code i use SwingWorkers but it unzip just one item from zip file and nothing appears in the jtextArea 在下面的代码中,我使用了SwingWorkers,但它仅将zip文件中的一项解压缩,而jtextArea中没有任何内容

public class UnzipWorkers extends SwingWorker<String,Void> {
private WebTextArea statusTextArea;
private File archive,outputDir;

public UnzipWorkers(WebTextArea statusTextArea,File archive,File outputDir) {
    this.archive=archive;
    this.outputDir=outputDir;
    this.statusTextArea = statusTextArea;
}

@Override
protected String doInBackground() throws Exception {
        statusTextArea.append(String.valueOf(System.currentTimeMillis()));
        try {
            ZipFile zipfile = new ZipFile(archive);
            for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) {
                ZipEntry entry = (ZipEntry) e.nextElement();
                String status = unzipEntry(zipfile, entry, outputDir);
                return status;
            }
        } catch (Exception e) {
            OeExceptionDialog.show(e);
        }

    return null;  
}

@Override
protected void done() {
    super.done();
    try {
        statusTextArea.append( get() + "\n");
        FileTreePanel.btnRefresh.doClick();
    } catch (InterruptedException e) {
        e.printStackTrace();  
    } catch (ExecutionException e) {
        e.printStackTrace(); 
    }
}

private String unzipEntry(ZipFile zipfile, final ZipEntry entry, File outputDir)  {
    String success = "Extracted failed: "+ entry + "\n";
    if (entry.isDirectory()) {
        createDir(new File(outputDir, entry.getName()));
    }

    File outputFile = new File(outputDir, entry.getName());
    if (!outputFile.getParentFile().exists()){
        createDir(outputFile.getParentFile());
    }
    try {
        BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
        BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));
        IOUtils.copy(inputStream, outputStream);
        outputStream.close();
        inputStream.close();
        success="Extracted successfully: " + entry + "\n";
    }catch (IOException io){
        OeExceptionDialog.show(io);
    }catch (NullPointerException n){
        OeExceptionDialog.show(n);
    }catch (ArithmeticException a){
        OeExceptionDialog.show(a);
    }
    return success;
}

private void createDir(File dir) {
    if (!dir.exists()) {
        try {
            dir.mkdirs();
        } catch (RuntimeException re) {
            OeExceptionDialog.show(re);
        }
    }
}
}

Judging by this line: 从这一行来看:

panel.statusTextArea.append(String.valueOf(System.currentTimeMillis()));

you are running your code on the EDT, otherwise you'd get an IllegalThreadAccess exception. 您正在EDT上运行代码,否则将收到IllegalThreadAccess异常。 So, in effect, your whole extraction procedure is done as the handling of a single event. 因此,实际上,整个提取过程都是作为单个事件的处理完成的。 Your requests to update the TextArea are just being pushed to the event queue and wait there until you have done "handling" the event that triggered the extraction code. 您更新TextArea的请求仅被推送到事件队列,并在那里等待,直到您完成“处理”触发提取代码的事件。

You must run your code on a dedicated thread (use SwingWorker). 您必须在专用线程上运行代码(使用SwingWorker)。

Did you try to move the 您是否尝试过移动

panel.statusTextArea.append(String.valueOf(System.currentTimeMillis()));

inside of the loop? 循环内?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM