簡體   English   中英

為什么沒有實時輸出到JTextArea?

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

我使用JTextArea顯示解壓縮文件的狀態。 但是由於某種原因,它不顯示附加的文本。 有人可以提出解決方案嗎?

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);
    }
}
}

在下面的代碼中,我使用了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);
        }
    }
}
}

從這一行來看:

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

您正在EDT上運行代碼,否則將收到IllegalThreadAccess異常。 因此,實際上,整個提取過程都是作為單個事件的處理完成的。 您更新TextArea的請求僅被推送到事件隊列,並在那里等待,直到您完成“處理”觸發提取代碼的事件。

您必須在專用線程上運行代碼(使用SwingWorker)。

您是否嘗試過移動

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

循環內?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM