Вывести список файлов и каталогов с помощью Jtree и File в Java

1

Я хочу создать очень простой файловый менеджер с JTree, но я видел только очень жесткий код, и я хочу, чтобы этот сценарий был очень чистым и простым.

Вы можете мне помочь? Как я могу перечислить каталоги моего компьютера в JTree?

  • 0
    Итак ... вы нашли существующий код, который делает это (в других вопросах), но вам слишком трудно это понять, и вы надеетесь, что это можно сделать более простым способом? Можете ли вы указать нам часть этого кода?
  • 1
    Хорошо но помогите пожалуйста
Показать ещё 4 комментария
Теги:
file-management
jtree

2 ответа

5

Я написал простейший пример файлового браузера, о котором я мог думать. В нем перечислены все каталоги и файлы на диске C: на компьютере под управлением Windows.

Вот результат.

Изображение 174551

И вот код. Я собрал все вместе в одном классе, чтобы упростить вставку здесь. Вы должны разделить классы.

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

}
  • 0
    Смотрите также реализацию TreeModel приведенную здесь .
  • 0
    @trashgod: да. В этом примере я сначала провел глубокий поиск файлов и каталогов на моем диске C :. Я работаю над более сложным файловым браузером, у которого есть реализация TreeModel и поиск в ширину.
Показать ещё 1 комментарий
1

Вот как я решил проблему, когда я столкнулся с ней для моего проекта, который включал 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);
    } 
    

Это мой первый ответ на переполнение стека :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню