当前位置: 首页 > 知识库问答 >
问题:

JavaFX按子目录和文件对TreeView进行排序

颛孙星海
2023-03-14
public void createTreeView(String dbpath) {

    TreeItem<Object> ROOTTREE = new TreeItem<>(dbpath.substring(dbpath.lastIndexOf("\\")));

    try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(dbpath))) {
        for(Path path: directoryStream) {
            if (Files.isDirectory(path)) {
                TreeItem<Object> leafs = new TreeItem<>(strPath.substring(1 + strPath.lastIndexOf("\\")));
                parent.getChildren().add(leafs);
                return leafs;
            } else {
                getLeafs(path, tree);
            }

        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    tree.setExpanded(ROOTTREE);
    TreeView_DBDirectory.setRoot(ROOTTREE);
    TreeView_DBDirectory.setShowRoot(true);
}

也许有更合适的解决方案?:/

共有1个答案

何高旻
2023-03-14

将目录存储在列表中。将文件存储在另一个列表中。首先将目录列表中的所有项添加到树子项中。然后将文件列表的所有项添加到树子项中。

TreeItem<Object> tree = new TreeItem<>(dbPath.substring(dbPath.lastIndexOf(File.separator)));

List<TreeItem<Object>> dirs = new ArrayList<>();
List<TreeItem<Object>> files = new ArrayList<>();

try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(dbPath))) {
    for(Path path: directoryStream) {
        if (Files.isDirectory(path)) {
            TreeItem<Object> subDirectory = new TreeItem<>(path);
            getSubLeafs(path, subDirectory);
            dirs.add(subDirectory);
        } else {
            files.add(getLeafs(path));
        }
    }

    tree.getChildren().addAll(dirs);
    tree.getChildren().addAll(files);
} catch (IOException e) {
    e.printStackTrace();
}

在以下目录结构上运行的示例

$ tree /tmp/test
/tmp/test
├── a1.txt
├── d1
│   ├── b1.txt
│   └── b2.txt
├── d2
│   └── c1.txt
└── f1.txt

我单击树节点来展开它们,因此您可以看到它们的值(默认情况下树节点不展开)。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.stage.Stage;

import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.util.ArrayList;
import java.util.List;

public class MenuClickSample extends Application {
    TreeView<Object> treeView = new TreeView<>();

    @Override public void start(Stage stage) throws IOException {
        createTreeView("/tmp/test");
        Scene scene = new Scene(treeView);
        stage.setScene(scene);
        stage.show();
    }

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

    private void createTreeView(String dbPath) {
        TreeItem<Object> tree = new TreeItem<>(dbPath.substring(dbPath.lastIndexOf(File.separator)));

        List<TreeItem<Object>> dirs = new ArrayList<>();
        List<TreeItem<Object>> files = new ArrayList<>();

        try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(dbPath))) {
            for(Path path: directoryStream) {
                if (Files.isDirectory(path)) {
                    TreeItem<Object> subDirectory = new TreeItem<>(path);
                    getSubLeafs(path, subDirectory);
                    dirs.add(subDirectory);
                } else {
                    files.add(getLeafs(path));
                }
            }

            tree.getChildren().addAll(dirs);
            tree.getChildren().addAll(files);
        } catch (IOException e) {
            e.printStackTrace();
        }

        tree.setExpanded(true);
        treeView.setRoot(tree);
        treeView.setShowRoot(true);
    }

    private TreeItem<Object> getLeafs(Path subPath) {
        String strPath = subPath.toString();
        TreeItem<Object> leafs = new TreeItem<>(strPath.substring(1 + strPath.lastIndexOf(File.separator)));
        return leafs;
    }

    private void getSubLeafs(Path subPath, TreeItem<Object> parent) {
        try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(subPath.toString()))) {
            for(Path subDir: directoryStream) {
                // explicit search for files because we dont want to get sub-sub-directories
                if (!Files.isDirectory(subDir)) {
                    String subTree = subDir.toString();
                    TreeItem<Object> subLeafs = new TreeItem<>(subTree.substring(1 + subTree.lastIndexOf(File.separator)));
                    parent.getChildren().add(subLeafs);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 类似资料:
  • 问题内容: 这是我的代码,它有效!但我希望能够根据名称,大小,修改日期等对文件列表进行排序 问题答案: 您可以定义许多不同的类来进行不同的比较,例如: 然后,您只需将它们换出: 要么

  • 问题内容: 我使用和在目录中显示文件名。但是他们无序。如何分类?语言是C。 问题答案: 在C语言中对事物进行排序的惯用方式是使用该函数。为此,最好安排所有文件名收集到一个指针数组中,然后对数组进行排序。 这虽然不太困难,但是确实需要一些动态数组管理,或者您需要引入静态限制(最大文件名长度,最大文件数)。

  • 但它不起作用..任何人都可以帮助我...我正在尝试不使用“import org.apache.commons.io.fileUtils;”。那怎么办呢?

  • 问题内容: 我正在尝试使用treeView创建菜单。这是我第一次使用treeView,并且已经在多个网站上进行了阅读。 我在进行动作事件时遇到一些问题。我想要做的基本上是在用户单击树形视图中的某个节点时触发并发生事件,到目前为止,我有以下内容: 不幸的是,这似乎不起作用。 有什么方法可以在不更改类型的情况下将甚至添加到单个项目? 问题答案: 根据JavaFX 2.2文档 : “..A TreeIt

  • 我有一个班的学生有以下领域: 字段“状态”可以有2个值:1。现在,2。缺席的 然后我有一个可观察的列表: 因此,我将学生存储在这个列表中。每个学生都有出席或缺席状态。 我需要按状态对这个观察列表进行排序。我希望目前状态的学生在该列表中名列第一。 有什么建议吗? 如果有任何帮助,我将不胜感激。