表示目录的 JavaFX

JavaFX representing directories

我正在 Java 中构建一个应用程序,我需要在 window 的任何类型的视图中表示一个预定义的目录。想象一下备份应用程序,其中主 window 显示特定目录下的所有文件。

有没有办法使用 JavaFX 做到这一点?我不在乎文件是否会显示为树或图标或其他任何东西。

谢谢

编辑:到目前为止我尝试过的方法都没有成功。这是我的控制器 class:

import javafx.scene.control.*;

import java.io.IOException;

public class ViewController {

    public ListView listView;

    public ViewController() throws IOException {
        listView = new ListView();
        listView.getItems().addAll("Iron Man", "Titanic", "Contact", "Surrogates");
    }
}

我的 fxml 包含:

<ListView fx:id="listView" prefHeight="200.0" prefWidth="200.0" />

我写了一个简短的程序,显示用户选择的文件和目录树。

结果:

工作原理:

当用户点击"Load Folder"按钮时, getNodesForDirectory 被调用,并递归遍历文件树,沿途生成树项。

代码如下:

import java.io.File;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;

public class DirectoryViewer extends Application {

    @Override
    public void start(Stage primaryStage) {
        TreeView<String> a = new TreeView<String>();
        BorderPane b = new BorderPane();
        Button c = new Button("Load Folder");
        c.setOnAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent e) {
                DirectoryChooser dc = new DirectoryChooser();
                dc.setInitialDirectory(new File(System.getProperty("user.home")));
                File choice = dc.showDialog(primaryStage);
                if(choice == null || ! choice.isDirectory()) {
                    Alert alert = new Alert(AlertType.ERROR);
                    alert.setHeaderText("Could not open directory");
                    alert.setContentText("The file is invalid.");

                    alert.showAndWait();
                } else {
                    a.setRoot(getNodesForDirectory(choice));
                }
            }
        });
        b.setTop(c);
        b.setCenter(a);
        primaryStage.setScene(new Scene(b, 600, 400));
        primaryStage.setTitle("Folder View");
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    public TreeItem<String> getNodesForDirectory(File directory) { //Returns a TreeItem representation of the specified directory
        TreeItem<String> root = new TreeItem<String>(directory.getName());
        for(File f : directory.listFiles()) {
            System.out.println("Loading " + f.getName());
            if(f.isDirectory()) { //Then we call the function recursively
                root.getChildren().add(getNodesForDirectory(f));
            } else {
                root.getChildren().add(new TreeItem<String>(f.getName()));
            }
        }
        return root;
    }
}

祝你项目顺利!