<AI>
JavaFXで指定ホルダー以下のサブフォルダを再帰的に取得し、ファイルを表示するには、
Java NIOの Files.walk または File.listFiles() を使用して階層をたどり、
リスト(ListView)やツリー(TreeView)に表示するのが最も効率的です。
以下は、選択したフォルダー以下のすべてのファイルを再帰的に探索し、
ListView にファイルパスを表示する最も一般的な実装例です。
1. サンプルコード
java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
public class RecursiveFileViewer extends Application {
@Override
public void start(Stage primaryStage) {
ListView listView = new ListView<>();
// フォルダー選択ダイアログを表示
DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setTitle("フォルダーを選択");
File selectedDirectory = directoryChooser.showDialog(primaryStage);
if (selectedDirectory != null) {
// 再帰的にファイルを探索してリストに追加
listFilesRecursively(selectedDirectory.toPath(), listView);
}
VBox root = new VBox(listView);
Scene scene = new Scene(root, 600, 400);
primaryStage.setTitle("再帰的ファイルビューア");
primaryStage.setScene(scene);
primaryStage.show();
}
private void listFilesRecursively(Path dir, ListView listView) {
// Files.walk を使用してディレクトリを深さ優先で探索
try (Stream paths = Files.walk(dir)) {
paths.filter(Files::isRegularFile) // ファイルのみを抽出
.map(Path::toAbsolutePath) // 絶対パスに変換
.map(Path::toString)
.forEach(listView.getItems()::add); // ListViewに追加
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
2. コードのポイント
・ Files.walk の利用:Java 8以降では、Files.walk(Path) メソッドを使うことで、再帰処理を手動で書くことなく簡潔にディレクトリツリーをトラバース(探索)できます。
・ try-with-resources:Files.walk はストリームを返すため、使用後は確実にリソースを開放できるよう try-with-resources 構文で囲むことが推奨されます。
・ ファイルの絞り込み:.filter(Files::isRegularFile) を挟むことで、ディレクトリ自体を除外してファイルだけを表示しています。
3. 画面のカスタマイズ(TreeViewへの応用)
もしエクスプローラーのような階層構造(ツリー状)で表示したい場合は、
TreeView と TreeItem を組み合わせて再帰処理を作成します。
ファイルツリーの構築には、 Qiita - JavaFX TreeViewとTreeItem のような実践的な解説やチュートリアルが参考になります。
フォルダの階層構造を保持したままアイテムを展開させたい場合に最適です