import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;
import java.io.File;
/**
* 实现树形文件浏览器
*/
public class TreeFileBrowser {
public static void main(String[] args) {
try {
// 设置系统界面风格
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
System.out.println("设置系统界面风格时出错");
}
// 桌面路径作为根路径,替换为你的桌面路径
File rootDir = new File("/Users/mi/Desktop");
new TreeFileBrowser().start(rootDir);
}
public void start(File rootFile) {
// 递归构建文件树的根节点
DefaultMutableTreeNode rootNode = buildFileTree(rootFile);
// 使用根节点去初始化一颗树
JTree fileBrowserTree = new JTree(rootNode);
fileBrowserTree.setVisible(true);
JFrame fileBrowserFrame = new JFrame("简单树形文件浏览器");
// 为 fileBrowserTree 添加滚动条,再将其添加到 fileBrowserFrame
fileBrowserFrame.add(new JScrollPane(fileBrowserTree));
fileBrowserFrame.setSize(new Dimension(300, 400));
// 界面居中,需在设置好界面大小之后调用
fileBrowserFrame.setLocationRelativeTo(null);
fileBrowserFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fileBrowserFrame.setVisible(true);
}
/**
* 递归构建文件树的根节点。不要用这个程序去获取某个盘(比如C、D)下文件树,因为一整个盘下的
* 文件太多,运行时如果没有设置特殊的参数(JVM 栈 和 堆的大小)可能会导致溢出使程序崩溃
*
* @param rootFile 根文件
* @return 文件树的根节点
*/
public DefaultMutableTreeNode buildFileTree(File rootFile) {
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(rootFile.getName());
// 如果是文件,即没有子文件
if (rootFile.isFile()) { return rootNode; }
File[] subFiles = rootFile.listFiles();
// 列出文件出错,一般不会发生
if (subFiles == null) { return rootNode; }
for (File subFile : subFiles) {
// 如果 subFile 是文件,则新建一个树节点
if (subFile.isFile()) {
DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(subFile.getName());
rootNode.add(subNode);
}
// 如果 subFile 是目录,那么构建一颗子树
if (subFile.isDirectory()) {
DefaultMutableTreeNode subNode = buildFileTree(subFile);
rootNode.add(subNode);
}
}
return rootNode;
}
}
界面完成后的测试