<AI>
指定したフォルダ以下のサブフォルダも含めて再帰的にファイルを取得し、
JavaFXの画面(例: ListView など)に表示する実装例です。
画面フリーズを防ぐため、バックグラウンド処理(Task)を用いて実装しています。
実装例
以下は、DirectoryChooser で選択したフォルダを走査してファイルパスのリストを作成するコードです。
java
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class FileListApp extends Application {
@Override
public void start(Stage primaryStage) {
ListView listView = new ListView<>();
Button btnSelect = new Button("フォルダ選択");
btnSelect.setOnAction(e -> {
DirectoryChooser dc = new DirectoryChooser();
File dir = dc.showDialog(primaryStage);
if (dir != null) {
// 別スレッドで再帰的にファイルを取得
Task> task = new Task<>() {
@Override
protected List call() {
List list = new ArrayList<>();
collectFiles(dir, list);
return list;
}
};
task.setOnSucceeded(ev -> listView.getItems().setAll(task.getValue()));
new Thread(task).start();
}
});
primaryStage.setScene(new Scene(new VBox(10, btnSelect, listView), 400, 400));
primaryStage.show();
}
// 再帰的にファイルを取得するメソッド
private void collectFiles(File dir, List fileList) {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) collectFiles(f, fileList);
else fileList.add(f.getAbsolutePath());
}
}
}
public static void main(String[] args) { launch(args); }
}
ポイント
・ バックグラウンド処理: Task を使用し、UIスレッドのフリーズを防ぎます。
・ 再帰処理: File.listFiles() を使用し、サブフォルダまで走査して全ファイルを取得します。
・ 安全性: listFiles() が null を返す可能性を考慮し、チェックを行います