使用与基本文件对应的自定义节点填充JTree的更好方法是什么?

时间:2016-06-18 22:18:22

标签: java file jtree

好的,这就是交易。它很简单......我用一个选定的基本文件夹中的文件填充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分钟,但是这里有大量的文件和文件夹......

0 个答案:

没有答案