好的,这就是交易。它很简单......我用一个选定的基本文件夹中的文件填充JTree。问题是我正在使用扩展CustomNode
的自定义类(DefaultMutableTreeNode
)来保存我的程序所需的额外数据。在处理包含大量子目录和文件的文件夹时,我当前的方法似乎非常慢。基本上,我目前解决这个问题的方法是两个函数......
功能#1)
参数:(CustomNode curDir)
此方法遵循给定的基本目录,并使用File[] dir = new File(workspacePath).listFiles();
提供其中所有文件的列表。当此方法遍历dir
中的所有文件时,它会检查文件是否存在是具有特定扩展名的目录或实际文件。如果是一个文件,它只会向curDir
添加一个新节点。如果是一个文件夹,它会向curDir
添加一个新节点,该节点是在返回CustomNode
时从第二个函数构造的。
功能#2)
参数:(File folder, String path)
这与第一个函数完全相同,但参数除外,当找到文件夹时,它会递归调用自身并返回CustomNode
以添加到curDir
in返回CustomNode
时的第一个函数。
以下是更好理解的实际代码
public void createNodes(CustomNode curDir){
File[] dir = new File(workspacePath).listFiles();
String currentNodePath = workspace.getText();
progress = 0;
for(File f : dir){
if(f.isDirectory()){
curDir.add(folder(f, currentNodePath));
}else if(f.isFile() && f.getName().indexOf(".py") > 0){
Nodes.add(new CustomNode(currentNodePath, f.getName(), false, true, Nodes.size() - 1));
curDir.add(Nodes.get(Nodes.size() - 1));
}
progress++;
}
}
public CustomNode folder(File folder, String path){
CustomNode node = new CustomNode(path, folder.getName(), true, false, Nodes.size() - 1);
Nodes.add(node);
File[] dir = folder.listFiles();
for(File f : dir){
if(f.isDirectory()){
node.add(folder(f, path + File.separator + folder.getName()));
}else if(f.isFile() && f.getName().indexOf(".py") > 0){
Nodes.add(new CustomNode(path + File.separator + folder.getName(), f.getName(), false, true, Nodes.size() - 1));
node.add(Nodes.get(Nodes.size() - 1));
}
}
if(dir.length == 0){
node.setAllowsChildren(true);
}
return node;
}
加载完所有文件后,我将JTree配置为合并我的自定义单元格渲染和其余设置。
提前致谢
编辑#1:
所有代码均可在https://github.com/Knotsman/Pythosis
获取我可以说它很慢,因为在加载所有文件之前GUI不会变得可见。有一条消息弹出说它加载文件,我知道它是如何知道它永远需要的文件加载。我想说加载我的java eclipse工作区需要2分钟,但是这里有大量的文件和文件夹......