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

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

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

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

这是结果。

文件浏览器Swing JFrame

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

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; } } } } 

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

scanner函数用于初始化参数并调用displayDirectoryContents函数

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

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

    使用的function

     public void displayDirectoryContents(File dir,DefaultMutableTreeNode root2) throws InterruptedException { DefaultMutableTreeNode newdir = new DefaultMutableTreeNode(); File[] files = dir.listFiles(); //creates array of file type for all the files found 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(); } } } 

    扫描仪function初始化上述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); } 

这是我关于堆栈溢出的第一个答案:)