在我的GUI中,我有一個TableView應該顯示一個加載文件的列表,在一個名爲PathGetter的類完成將它們加載到一個ObservableArrayList之後,但我無法正確實現任務。Propper JavaFX線程實現
這是JavaFX類
browseButton.setOnAction(event -> {
File dir = folderPicker.showDialog(bwindow);
if(dir != null){
directoryLocation.setText(String.valueOf(dir));
bottom.getChildren().add(new javafx.scene.control.Label("Loading Tracks"));
//PathGetter.getPath(directoryLocation.getText());
PathGetter task = new PathGetter(directoryLocation.getText());
Thread th = new Thread(task);
try {
pjesme = FXCollections.observableArrayList();
} catch (Exception e) {
e.printStackTrace();
}
selection.setItems(pjesme);
chSelAll.setDisable(false);
chSelIncomplete.setDisable(false);
chSelNoCover.setDisable(false);
}
});
的重要組成部分,這是應該
public class PathGetter extends Task<ObservableList<Track>> {
static boolean getSubDirs;
static ArrayList <Track> allFiles;
public static int trNr = 0;
private static String fullPath;
public PathGetter(String path) {
fullPath = path;
}
public static int getTrNr() {
return trNr;
}
public static void setTrNr(int trNr) {
PathGetter.trNr = trNr;
}
public static boolean isSupported (File f){
//supported file types
if(String.valueOf(f).endsWith(".flac") || String.valueOf(f).endsWith(".mp3") || String.valueOf(f).endsWith(".aiff") || String.valueOf(f).endsWith(".ogg") || String.valueOf(f).endsWith(".mp4")){
return true;
}else{
return false;
}
}
@Override
protected ObservableList<Track> call() throws Exception {
getSubDirs = Browser.chSubDirs.isSelected();
allFiles = new ArrayList<Track>();
Queue<File> dirs = new LinkedList<File>();
dirs.add(new File(fullPath));
while (!dirs.isEmpty()) {
for (File f : dirs.poll().listFiles()) {
if (f.isDirectory() && getSubDirs == true) {
dirs.add(f);
} else if (f.isFile() && isSupported(f)) {
allFiles.add(new Track(f));
setTrNr(getTrNr()+1);
}
}
}
ObservableList<Track> returnList = FXCollections.observableArrayList(allFiles);
return returnList;
}
}
工作,我不明白如何讓TableView中等待任務的類而不會阻塞整個JavaFX線程,這基本上破壞了任務的目的。我希望它能夠實時顯示進度,只需顯示當時添加的曲目數量即可。
問:
所以如下我會寫任務你似乎是跟蹤'處理的文件計數trNr'。這是你想要在UI中逐步顯示的值嗎?在你開始處理文件之前,你有沒有辦法知道總體情況?沒有這些,你顯然不能做任何「完全百分比」追蹤。 –
@James_D事先沒有辦法知道文件的總數,除非我想先計算它們,現在我真的不想這樣做。我只想製作一個簡單的標籤,顯示迄今爲止添加了多少個文件,因此用戶知道該應用正在做些什麼。但我認爲這很容易,我不明白這些關於懸掛UI線程的主要問題的答案。 – DzeriMNE