JTree显示驱动器根本不显示

时间:2017-04-02 10:57:10

标签: java swing file jtree defaultmutabletreenode

我的任务是显示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根本不显示 我认为它遇到了特定目录的问题。我已添加存在,并且是隐藏的检查以跳过此问题的根源,但它没有帮助。

此外,existsisHiddenisDirectory会返回false我的某些有效目录目录(我使用的是Windows 10)。

1 个答案:

答案 0 :(得分:1)

File.listFiles()是违反Java惯例/良好做法的古老方法之一,永远不会从返回数组的方法返回null。所以你必须检查null

来自文档:

  

表示文件和目录的抽象路径名数组   此抽象路径名表示的目录。阵列将是   如果目录为空则为空。如果此抽象返回null   pathname不表示目录,或者发生I / O错误。

我已更改您的代码,使其更安全一些。如果从EDT调用它,您可能需要添加一些日志消息等,而不是将异常抛入必杀技。

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以获得更好的解决方案。