如何在javafx TreeView中使目录可扩展



我有一个问题,我不知道如何解决,也无法在网上找到一些线索,但这个问题应该很琐碎。。。

我有一个TreeView<File>,我想用基于给定路径的目录和文件列表来填充它。问题是目录被添加到树中,但无法扩展,因此我无法显示其中的文件。

以下是我的一些不起眼的控制器代码:

public class MainViewController implements Initializable {
    @FXML // fx:id="filesTree"
    private TreeView<File> filesTree;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        File currentDir = new File("src/xslt"); // current directory
        findFiles(currentDir);
    }
    public void findFiles(File dir) {
    TreeItem<File> root = new TreeItem<>(new File("Files:"));
    root.setExpanded(true);
    try {
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                System.out.println("directory:" + file.getCanonicalPath());
                findFiles(file);
            } else {
                System.out.println("     file:" + file.getCanonicalPath());
                root.getChildren().add(new TreeItem<>(file));
            }
            root.getChildren().add(new TreeItem<>(file));
        }
        filesTree.setRoot(root);
        } catch (IOException e) {
           e.printStackTrace();
        }
    }
}

我的FXML视图非常简单——只是一个带有TreeViewAnchorPane。但如果需要,我也可以分享。

所以问题是——我如何使目录可扩展?我找到了setExpanded(true)方法,但那是不同的。

基本上,每次找到目录时,递归方法都必须创建一个新的根。

private void findFiles(File dir, TreeItem<File> parent) {
    TreeItem<File> root = new TreeItem<>(dir);
    ...
}

并且该root必须作为下一级别的父级发送。

    if (file.isDirectory()) {
        System.out.println("directory:" + file.getCanonicalPath());
        findFiles(file,root);
    }

最后,只有在最顶层,我们才将这个根设置为树的根View:

if(parent==null){
    filesTree.setRoot(root);
}

而在内部级别:

else {
    parent.getChildren().add(root);
}

因此,经过这几次调整后,这应该是可行的:

@FXML private TreeView<File> filesTree;
@Override
public void initialize(URL url, ResourceBundle rb) {
    File currentDir = new File("src/xslt"); // current directory
    findFiles(currentDir,null);
}
private void findFiles(File dir, TreeItem<File> parent) {
    TreeItem<File> root = new TreeItem<>(dir);
    root.setExpanded(true);
    try {
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                System.out.println("directory:" + file.getCanonicalPath());
                findFiles(file,root);
            } else {
                System.out.println("     file:" + file.getCanonicalPath());
                root.getChildren().add(new TreeItem<>(file));
            }
        }
        if(parent==null){
            filesTree.setRoot(root);
        } else {
            parent.getChildren().add(root);
        }
    } catch (IOException e) {
       e.printStackTrace();
    }
} 

最新更新