2015-04-16 49 views
0

我有一個名爲evaluate()的方法,它將File對象作爲參數。此方法必須執行繁重且長時間運行的作業(每個文件至少5秒)。這種方法也將同步化。JProgressBar用於操作時間消耗操作

用戶可以使用JFileChooser選擇一些文件,併爲每個選定的文件評估方法將被調用。由於此任務需要一些時間,我想爲每個文件顯示一個JProgressBar(不確定性將設置爲true),並顯示消息「正在處理名稱爲xyz的文件」。如果EDT正在執行評估任務,gui將被凍結,所以進度條將無法正確顯示。另外,我嘗試了一個Swing Worker,但是在SwingWorker作業完成時如何知道EDT,併爲下一個文件顯示另一個進度條? 到現在爲止我想這一點,但沒有結果:

private void processLabsEvaluation(File[] selectedFiles) { 
     for (int i = 0; i < selectedFiles.length; i++) { 
      final File file = selectedFiles[i]; 
      Frame progressBar = new ProgressBarEvaluation(); 
      progressBar.setVisible(true); 
      SwingWorker<LabResult, Void> worker 
       = new SwingWorker<LabResult, Void>() { 

       @Override 
       public LabResult doInBackground() { 
       LabResult intDoc = LabEvaluator.getInstance().evaluate(file); 
       return intDoc; 
       } 
      }; 
      worker.execute(); 

      progressBar.setVisible(false); 

    } 
    } 

    private class LoadClicked implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      fileChooser.showOpenDialog(LoadLabsPanel.this); 
      File[] selectedFiles = fileChooser.getSelectedFiles(); 
      if(selectedFiles == null) { 
       return; 
      } 
      processLabsEvaluation(selectedFiles); 
     } 
    } 
+0

您可以使用一個'SwingWorker'來運行整個事情,並使用'publish()'作爲[中間結果](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/interim)。 html)(每個處理文件)。 – kiheru

回答

0

您可以使用SwingUtilities.invokeLater(Runnable)在EDT執行Runnable。因此,在工作線程完成一個文件的評估後,您可以創建一個Runnable來更新進度條,然後將此可運行結果傳遞給SwingUtilities.invokeLater