【问题标题】:How to make directories expandable in javafx TreeView如何在 javafx TreeView 中使目录可扩展
【发布时间】:2014-11-01 14:34:11
【问题描述】:

我有一个问题,不知道怎么解决,网上也找不到一些线索,不过问题应该是微不足道的……

我有一个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 视图非常简单——只是一个AnchorPane 和一个TreeView。但如果需要,我也可以分享。

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

【问题讨论】:

    标签: java javafx treeview


    【解决方案1】:

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

    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);
        }
    

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

    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();
        }
    } 
    

    【讨论】:

    • 感谢详细的解答和解释!完美运行!
    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多