Java JTree显示驱动器根本不显示
我的任务是显示PC驱动器所有目录/文件的树, 我有一个类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()){
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以获得更好的解决方案。首先,我会使用NIO2Path
API而不是File
,因为File
不喜欢符号链接。我也会小心地扫描整个驱动器,并确保您使用的是“惰性”加载方法,因此您只加载需要显示的内容1)另请参阅。它根据用户选择的目录构建树的每个部分,主要原因是构建整个(典型)驱动器的树需要很长时间。2)为了更好地帮助更快,发布一个或。也考虑这一点,使用<代码> FieleReMeDele>代码>。