2012-05-04 11 views
1

JTextAreaを使用してファイルを解凍している状態を表示します。 しかし、理由のために、追加されたテキストは表示されません。 解決策を提案する人はいますか?以下のコードで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ファイルとゼロからちょうど1項目を解凍し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); 
     } 
    } 
} 
} 
+0

正直言って私はこれを引き起こしているのか分かりません。解凍が完了してもテキストが表示されませんか?そうであれば、スレッドに関連している可能性があります。 –

+1

EDT(Event Dispatch Thread)をブロックしないでください。このとき、GUIはフリーズします。長期間の作業には 'SwingWorker'を使います。 詳細については、[同時実行性](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)を参照してください。 (注:WAGはタイトルに基づいています) –

+0

statusTextAreaのモデルはnullですか? –

答えて

0

に表示されますが

panel.statusTextArea.append(String.valueOf(System.currentTimeMillis())); 
を移動しようとしましたループの内部に

+1

いいえ、彼は 'unzipEntry()'にラップしています。他の何かがEDTを妨害していると思います。これはおそらく 'unzipEntry()'自身です。 [sscce](http://sscce.org/)が役立ちます。 – trashgod

1

このラインから判断する:あなたがEDTにあなたのコードを実行している

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

、そうでなければ、IllegalThreadAccess例外を取得したいです。実際には、抽出処理全体が単一のイベントの処理として実行されます。 TextAreaを更新する要求は、イベントキューにプッシュされており、抽出コードをトリガしたイベントを「処理」するまで待機します。

コードを専用のスレッドで実行する必要があります(SwingWorkerを使用してください)。

+0

何このbelockについて: 'SwingUtilities.invokeLaterを(新しいRunnableを(){ ます。public void実行(){ panel.statusTextArea.append( "抽出:" +エントリー+ "\ n" は); } }); ' – itro

+0

そのブロックはよく見えます。 –

+0

なぜtextAreaに何も表示されませんか?私はそれについて何の説明もしていない。 – itro

関連する問題