为什么SwingWorkers不按预期更新textArea?

itr*_*tro 1 java user-interface swing swingworker

我使用swingworkers来提取zipfile,并将提取的prosecc附加到GUI中的textArea.它只从压缩文件中提取一个项目,并且没有在textArea中显示任何内容.

有谁能建议任何解决方案?

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();
                unzipEntry(zipfile, entry, outputDir);

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

    return "Extracted successfully: " + archive.getName() + "\n";  
}

@Override
protected void done() {
    super.done();
    try {
        statusTextArea.append( get());
        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);
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

mKo*_*bel 5

SwingWorker不指定作品这种方式,定期输出doInBackground()是否有方法process()publish(),可以

1)使用Runnable#Thread代替SwingWorker然后你的代码通过添加JTextArea.append(),包装工作invokeLater()

2)添加process()publish()SwingWorker,此方法中把IOStream和附加到JTextArea周期性

3)我建议使用方法get()来实现原因


归档时间:

查看次数:

602 次

最近记录:

13 年,4 月 前