在代码中创建了一个新的线程来执行Task,所以mytask只会执行一次。为了解决这个问题,可以将创建和执行Task的代码移到主线程中,如下:
@FXML private void confirmExcel2(ActionEvent event) {
System.out.println("读取文件map=>>>>>> " + map);
String zhu = map.get("zhu");
String fujian = map.get("fujian");
String fileName = map.get("fileName");
long start = System.currentTimeMillis();
// 显示进度条
progressBar.setVisible(true);
// 主文件
File file = new File(zhu, fileName);
if (!file.exists()) {
System.out.println("路径下没有文件!");
return;
}
try {
// 子文件
System.out.println("batchUploadFilePath=> {}" + fujian);
File sheetFile = new File(fujian);
File[] sheetFiles = sheetFile.listFiles();
if (sheetFiles.length == 0) {
System.out.println("发现目录下未存在子附件!");
return;
}
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
double total = (double) sheetFiles.length;
double progress = 0;
for (File sfile : sheetFiles) {
// 获取sfile的数据
ExportPojo exportPojo = ImportExcelUtils.importExcelToSheet(sfile.getPath(), ExcelPojo.class);
// 写出到指定文件
ImportExcelUtils.exportDataToSheet(file, exportPojo, zhu, fileName);
// 手动更新进度条
progress++;
updateProgress(progress, total);
}
return null;
}
};
// 绑定进度条的属性
progressBar.progressProperty().bind(task.progressProperty());
task.setOnSucceeded(event1 -> {
progressBar.setVisible(false);
// 关闭当前窗口或程序
Stage stage = (Stage) progressBar.getScene().getWindow();
stage.close();
});
// 执行Task
new Thread(task).start();
} catch (Exception e) {
// 提醒框
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("错误");
alert.setHeaderText("发生错误");
alert.setContentText("出现了一个错误,请联系管理员。");
alert.showAndWait();
throw new RuntimeException(e);
}
Long time = System.currentTimeMillis() - start;
System.out.println("time = " + time);
}




