在 Java 中使用 Jtree 和 File 列出文件和目录

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23804675/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 01:16:14  来源:igfitidea点击:

List files and directories with Jtree and File in Java

javajtreefile-management

提问by user3664644

I want to create a very very simple file manager with JTree, but I only saw a very hard code and I want to create this script very clean and simple.

我想用 JTree 创建一个非常非常简单的文件管理器,但我只看到了一个非常硬的代码,我想创建一个非常干净和简单的脚本。

Can you help me? How do I List the directories of my computer in JTree?

你能帮助我吗?如何在 JTree 中列出我计算机的目录?

回答by Gilbert Le Blanc

I wrote the simplest example of a file browser I could think of. It lists all of the directories and files on the C: drive on a Windows computer.

我写了我能想到的最简单的文件浏览器示例。它列出了 Windows 计算机上 C: 驱动器上的所有目录和文件。

Here's the result.

结果如下。

File Browser Swing JFrame

文件浏览器 Swing JFrame

And here's the code. I put everything together in one class to make it easier to paste here. You should separate the classes.

这是代码。我将所有内容放在一个类中,以便更轻松地粘贴到此处。您应该将课程分开。

package com.ggl.testing;

import java.io.File;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class FileBrowser implements Runnable {

    private DefaultMutableTreeNode root;

    private DefaultTreeModel treeModel;

    private JTree tree;

    @Override
    public void run() {
        JFrame frame = new JFrame("File Browser");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        File fileRoot = new File("C:/");
        root = new DefaultMutableTreeNode(new FileNode(fileRoot));
        treeModel = new DefaultTreeModel(root);

        tree = new JTree(treeModel);
        tree.setShowsRootHandles(true);
        JScrollPane scrollPane = new JScrollPane(tree);

        frame.add(scrollPane);
        frame.setLocationByPlatform(true);
        frame.setSize(640, 480);
        frame.setVisible(true);

        CreateChildNodes ccn = 
                new CreateChildNodes(fileRoot, root);
        new Thread(ccn).start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new FileBrowser());
    }

    public class CreateChildNodes implements Runnable {

        private DefaultMutableTreeNode root;

        private File fileRoot;

        public CreateChildNodes(File fileRoot, 
                DefaultMutableTreeNode root) {
            this.fileRoot = fileRoot;
            this.root = root;
        }

        @Override
        public void run() {
            createChildren(fileRoot, root);
        }

        private void createChildren(File fileRoot, 
                DefaultMutableTreeNode node) {
            File[] files = fileRoot.listFiles();
            if (files == null) return;

            for (File file : files) {
                DefaultMutableTreeNode childNode = 
                        new DefaultMutableTreeNode(new FileNode(file));
                node.add(childNode);
                if (file.isDirectory()) {
                    createChildren(file, childNode);
                }
            }
        }

    }

    public class FileNode {

        private File file;

        public FileNode(File file) {
            this.file = file;
        }

        @Override
        public String toString() {
            String name = file.getName();
            if (name.equals("")) {
                return file.getAbsolutePath();
            } else {
                return name;
            }
        }
    }

}

回答by ashish2199

This is how I solved the problem when i encountered it for my project which involved a jtree to show results of my scan.

这就是我在我的项目中遇到问题时解决问题的方法,该项目涉及一个 jtree 来显示我的扫描结果。

scanner function is used to initialise the parameters and call the displayDirectoryContents function

使用scanner函数初始化参数,调用displayDirectoryContents函数

Here are some drawbacks of the method i used

以下是我使用的方法的一些缺点

  • It shows empty folders as leaf nodes instead of showing them as a leaf with no children
  • The model should be manually cleared by right clicking on the properties and clearing the model

    Function used

  • 它将空文件夹显示为叶节点,而不是将它们显示为没有子节点的叶节点
  • 应通过右键单击属性并清除模型来手动清除模型

    使用的功能

public void displayDirectoryContents(File dir, DefaultMutableTreeNode root2)
       throws InterruptedException {

    DefaultMutableTreeNode newdir = new DefaultMutableTreeNode();

    // creates array of file type for all the files found
    File[] files = dir.listFiles();

    for (File file : files) {
        if (file == null) {
            System.out.println("NUll directory found ");
            continue;
        }
        if (file.isDirectory()) {
            // file is a directory that is a folder has been dound

            if (file.listFiles() == null) {
                // skips null files
                continue;
            }

            // gets the current model of the jtree
            DefaultTreeModel model = (DefaultTreeModel) result.getModel();

            // gets the root
            DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();

            // generates a node newdir using filename
            newdir = new DefaultMutableTreeNode(file.getName());

            // adds a node to the root of the jtree
            root2.add(newdir);

            // refresh the model to show the changes
            model.reload();

            // recursively calls the function again to explore the contents
            // folder
            displayDirectoryContents(file, newdir);
        } else {
            // Else part File is not a directory

            // gets the current model of the tree
            DefaultTreeModel model = (DefaultTreeModel) result.getModel();

            // selected node is the position where the new node will be
            // inserted
            DefaultMutableTreeNode selectednode = root2;

            DefaultMutableTreeNode newfile = new DefaultMutableTreeNode(file.getName());

            // inserts a node newfile under selected node which is the root
            model.insertNodeInto(newfile, selectednode, selectednode.getChildCount());

            // refresh the model to show the changes
            model.reload();

        }

    }
}

Scanner Function to initialise the above function

初始化上述函数的扫描器函数

public void scanner() throws InterruptedException {
    // creates a file with the location filename
    String location = "C:\Users\Ashish Padalkar\Documents";
    File currentDir = new File(location);

    // result is the variable name for jtree
    DefaultTreeModel model = (DefaultTreeModel) result.getModel();
    // gets the root of the current model used only once at the starting
    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    // function caled
    displayDirectoryContents(currentDir, root);
}