Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTree显示驱动器根本不显示_Java_Swing_File_Jtree_Defaultmutabletreenode - Fatal编程技术网

Java JTree显示驱动器根本不显示

Java JTree显示驱动器根本不显示,java,swing,file,jtree,defaultmutabletreenode,Java,Swing,File,Jtree,Defaultmutabletreenode,我的任务是显示PC驱动器所有目录/文件的树, 我有一个类DirectoryNode,它扩展了DefaultMutableTreeNode和File字段directoryPath。我递归地构建节点: public void buildDirectoryTree(){ if(!directoryPath.isDirectory()){ return; } for(File f : directoryPath.listFiles()){

我的任务是显示PC驱动器所有目录/文件的树, 我有一个类
DirectoryNode
,它扩展了
DefaultMutableTreeNode
File
字段
directoryPath
。我递归地构建节点:

public void buildDirectoryTree(){
    if(!directoryPath.isDirectory()){
            return;
    }

    for(File f : directoryPath.listFiles()){
        if(f.isHidden() || !f.exists()) continue;
        DirectoryNode newChild = new DirectoryNode(f);
        add(newChild);
        newChild.buildDirectoryTree();
    }
}
对于具体的目录,它工作得很好,但当我尝试将其用于整个驱动器或一些大型目录时,带有此节点的
JTree
根本不会显示 我认为它遇到了特定目录的问题。我添加了“存在”和“隐藏”检查以跳过此问题的根源,但它没有帮助

此外,对于我的一些有效目录(我使用的是Windows 10),存在
isHidden
isDirectory
返回
false

文件.listFiles()
是一种古老的方法,它违反了Java的惯例/良好实践,即从不从返回数组的方法返回
null
。因此,您必须检查
null

从文档中:

一个抽象路径名数组,表示中的文件和目录 此抽象路径名表示的目录。阵列将被删除 如果目录为空,则为空。如果此摘要为空,则返回null 路径名不表示目录,或者如果发生I/O错误

我已经更改了你的代码,使它更安全一点。如果它是从EDT调用的,您可能希望添加一些日志消息或类似的消息,而不是将异常抛出到nirvana中

public void buildDirectoryTree() throws IOException {
    if (!directoryPath.isDirectory()) {
            return;
    }
    final File[] files = directoryPath.listFiles();
    if (files != null) {
        for (File f : files) {
            if (f.isHidden() || !f.exists()) continue;
            DirectoryNode newChild = new DirectoryNode(f);
            add(newChild);
            newChild.buildDirectoryTree();
        }
    } else {
        throw new IOException("Failed to list files for " + directoryPath);
    }
}

正如其他人所指出的,有更多的现代API,它们的引入是有充分理由的。我建议阅读NIO2和
Path
API以获得更好的解决方案。

首先,我会使用NIO2
Path
API而不是
File
,因为
File
不喜欢符号链接。我也会小心地扫描整个驱动器,并确保您使用的是“惰性”加载方法,因此您只加载需要显示的内容1)另请参阅。它根据用户选择的目录构建树的每个部分,主要原因是构建整个(典型)驱动器的树需要很长时间。2)为了更好地帮助更快,发布一个或。也考虑这一点,使用<代码> FieleReMeDele>代码>。