Я хочу создать очень простой файловый менеджер с JTree, но я видел только очень жесткий код, и я хочу, чтобы этот сценарий был очень чистым и простым.
Вы можете мне помочь? Как я могу перечислить каталоги моего компьютера в JTree?
Я написал простейший пример файлового браузера, о котором я мог думать. В нем перечислены все каталоги и файлы на диске C: на компьютере под управлением Windows.
Вот результат.
И вот код. Я собрал все вместе в одном классе, чтобы упростить вставку здесь. Вы должны разделить классы.
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;
}
}
}
}
TreeModel
приведенную здесь .
Вот как я решил проблему, когда я столкнулся с ней для моего проекта, который включал jtree, чтобы показать результаты моего сканирования.
функция сканера используется для инициализации параметров и вызова функции displayDirectoryContents
Вот некоторые недостатки метода, который я использовал
Модель должна быть очищена вручную, щелкнув правой кнопкой мыши на свойствах и очистив модель
Используемая функция
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();
}
}
}
Функция сканера для инициализации указанной функции
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);
}
Это мой первый ответ на переполнение стека :)