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