在 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
List files and directories with Jtree and File in Java
提问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.
结果如下。
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);
}