我是Java和JavaFX的初学者。我有一个问题,我想计算文件夹中的 PDF,我想显示进度条中的进程。
我知道PDF的数量,我必须检查是否都在那里。
读取文件夹的方法是:
private void dir(File fileRoot) {
File[] files = fileRoot.listFiles();
for(File file : files) {
if(file.isDirectory()){
dir(file);
}
else{
String dateiName = file.getName();
if(dateiName.endsWith(".pdf")){
++countPDF;
System.out.println(countPDF);
}
}
}
更新进度条的方法是:
private Task<Boolean> createWorker() {
return new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
updateMessage(countPDF + "");
updateProgress(countPDF, number);
}
return true;
};
}
如何在控制器中组合?
public class Controller {
@FXML
private Button startButton;
@FXML
private ProgressBar myProzessBar;
@FXML
private Label label;
private int countPDF;
private File directory;
@FXML
private void actionStart(ActionEvent event) {
String path = "C:\root\";
directory = new File(path);
myProzessBar.progressProperty().unbind();
myProzessBar.progressProperty().bind(task.progressProperty());
label.textProperty().bind(task.messageProperty());
}
@FXML
void initialize() {
}
我尝试了几天来解决这个问题,现在我没有更多的想法。
请帮助我。
你可以这样做:
private Path directory;
.....
private Task<ObservableList<Integer>> createWorker() {
return new Task<ObservableList<Integer>>() {
@Override
protected ObservableList<Integer> call() throws Exception {
Stack<Path> stack = new Stack();
stack.push(directory);
int i = 0;
while (!stack.empty()) {
if (isCancelled()) {
break;
}
Path root = stack.pop();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(root);) {
for (Path path : stream) {
if (Files.isDirectory(path)) {
stack.push(path);
} else {
if (path.toString().endsWith(".pdf")) {
i++;
results.add(i);
updateProgress(i, 100);
updateValue(results);
Thread.sleep(5);
}
}
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
return results;
}
};
}
有了这个,我可以读取根文件夹,但不能读取子文件夹。这很容易。
但是我必须可以读取根文件夹和子文件夹。
这是代码:
import java.io.File;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
public class Controller {
@FXML
private Button startButton;
@FXML
private ProgressBar myProzessBar;
@FXML
private Label label;
private Task<Boolean> myWorker;
private int countPDF;
private File directory;
@FXML
private void actionStart(ActionEvent event) {
String path = "C:\root\";
directory = new File(path);
if(!directory.isDirectory())
return;
countPDF = 0;
myWorker = createWorker(directory);
myWorker.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
startButton.setDisable(false);
label.textProperty().unbind();
label.setText("Total " + countPDF);
}
});
myProzessBar.progressProperty().unbind();
myProzessBar.progressProperty().bind(myWorker.progressProperty());
label.textProperty().bind(myWorker.messageProperty());
new Thread(myWorker).start();
startButton.setDisable(true);
}
@FXML
void initialize() {
}
private Task<Boolean> createWorker(File fileRoot) {
return new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
File[] files = fileRoot.listFiles();
for(File file : files) {
if(file.isDirectory())
// restart the method, but how can I do that
else{
String fileName = file.getName();
if(fileName.endsWith(".pdf")){
updateMessage(++countPDF + "");
updateProgress(countPDF, 100);
}
}
}
return true;
}
};
}
}