JTree mit Verzeichnissen füllen

Xandro

- Mistkerl -
Moin,

ich habe eine Datenbank in einem Verzeichnis, in dem auch Unterverzeichnisse enthalten sind - also eine Dateidatenbank.
Der Ordner liegt bei mir im Projektverzeichnis und soll so durchlaufen werden,
dass jeder Ordner ein Node ist und wenn mehrere Ordner in einem sind, diese dem einen als Node (gleichrangig) untergeordnet werden.

Die Funktion zum Durchlaufen habe ich schon, aber ich weiss nun nicht, wie ich jeden Node einzeln erstelle...

Da ich leider kein Inet daheim habe, kann ich grad den Code nicht niederschreiben.

Gruss,
Xan
 
Hallo!

Schau mal hier:
Code:
/**
  * 
  */
 package de.tutorials;
 
 import java.io.File;
 
 import javax.swing.JFrame;
 import javax.swing.JScrollPane;
 import javax.swing.JTree;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.TreeNode;
 
 /**
  * @author Tom
  * 
  */
 public class JTreeDirectoryView extends JFrame {
 
 	public JTreeDirectoryView() {
 		super("JTreeDirectoryView");
 		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
 		JTree tree = new JTree();
 		buildTreeModelAccordingToDirectoryStructure(new File("c:/Programme"),
 				tree);
 
 		add(new JScrollPane(tree));
 
 		pack();
 		setVisible(true);
 	}
 
 	void buildTreeModelAccordingToDirectoryStructure(File file, JTree tree) {
 		tree.setModel(new DefaultTreeModel(new FileSystemTreeNode(file)));
 	}
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		new JTreeDirectoryView();
 	}
 
 	class FileSystemTreeNode extends DefaultMutableTreeNode {
 
 		public FileSystemTreeNode(File file) {
 			setUserObject(file);
 		}
 
 		public int getChildCount() {
 			return ((File) getUserObject()).list().length;
 		}
 
 		public TreeNode getChildAt(int index) {
 			return new FileSystemTreeNode(
 		    		((File) getUserObject()).listFiles()[index]);
 		}
 
 		public boolean isLeaf() {
 			return !((File) getUserObject()).isDirectory();
 		}
 
 		public String toString() {
 			return ((File) getUserObject()).getName();
 		}
 	}
 }

Gruss Tom
 
Hallo,
ich habe zur Zeit das gleiche Problem, die Lösung von Tom ist auch gut, aber ich müsste vorher die Möglichkeit haben, die Pfade/Dateien zu selektieren. Bei mir sollen in einem Beispiel z. B. keine Dateien angezeigt werden.
Kann mir da jemand weiterhelfen? :confused:
 
Hallo!

Hier werden nur Verzeichnisse im Baum angezeigt:
Code:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

/**
 * @author Tom
 * 
 */
public class JTreeDirectoryView extends JFrame {

    public JTreeDirectoryView() {
        super("JTreeDirectoryView");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JTree tree = new JTree();
        buildTreeModelAccordingToDirectoryStructure(new File("c:/Programme"),
                tree);

        add(new JScrollPane(tree));

        pack();
        setVisible(true);
    }

    void buildTreeModelAccordingToDirectoryStructure(File file, JTree tree) {
        tree.setModel(new DefaultTreeModel(new FileSystemTreeNode(file)));
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new JTreeDirectoryView();
    }

    class FileSystemTreeNode extends DefaultMutableTreeNode {

        public FileSystemTreeNode(File file) {
            setUserObject(file);
        }

        public int getChildCount() {
            return filterDirectories((File) getUserObject()).size();
        }

        public TreeNode getChildAt(int index) {
            return new FileSystemTreeNode((File) filterDirectories(
                    (File) getUserObject()).get(index));
        }

        public boolean isLeaf() {
            return !((File) getUserObject()).isDirectory();
        }

        public String toString() {
            return ((File) getUserObject()).getName();
        }

        private List filterDirectories(File file) {
            List directoryList = new ArrayList();
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    directoryList.add(files[i]);
                }
            }
            return directoryList;
        }
    }
}

Gruß Tom
 
Super das ist genau das was ich gesucht habe. Jetzt noch eine kleine Frage: Ist es möglich, den Root-Pfad anzuzeigen? Wenn ich "c:/Programme" habe, erscheint als Root ein Ordner ohne beschreibung...
 
Hallo!

Schau mal hier:
Code:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

/**
 * @author Tom
 * 
 */
public class JTreeDirectoryView extends JFrame {

    File root;
    
    public JTreeDirectoryView() {
        super("JTreeDirectoryView");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JTree tree = new JTree();
        buildTreeModelAccordingToDirectoryStructure(root = new File("c:/Program Files"),
                tree);

        add(new JScrollPane(tree));

        pack();
        setVisible(true);
    }

    void buildTreeModelAccordingToDirectoryStructure(File file, JTree tree) {
        tree.setModel(new DefaultTreeModel(new FileSystemTreeNode(file)));
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new JTreeDirectoryView();
    }

    class FileSystemTreeNode extends DefaultMutableTreeNode{

        public FileSystemTreeNode(File file) {
            setUserObject(file);
        }

        public int getChildCount() {
            return filterDirectories((File) getUserObject()).size();
        }

        public TreeNode getChildAt(int index) {
            return new FileSystemTreeNode((File) filterDirectories(
                    (File) getUserObject()).get(index));
        }

        public boolean isLeaf() {
            return getChildCount() == 0;
        }

        public String toString() {
            String string = ((File) getUserObject()).getName();
            if(getUserObject() == root){
                string = ((File) getUserObject()).getAbsolutePath();
            }
            return string;
        }

        private List filterDirectories(File file) {
            List directoryList = new ArrayList();
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    directoryList.add(files[i]);
                }
            }
            return directoryList;
        }
    }
}

Gruss Tom
 
Sehr geehrter Tom,

ich habe ihre implementierung als grundlage für meinen explorer genommen und soweit hat bisher alles wunder und einwandfrei funktioniert. Nun will ich die möglichkeiten erweitern und auf basis ihrer implementierung eine Sort-Funktion einbauen. Zur zeit sieht es nämlich so aus, dass unabhängig von dateitypen oder gar ob es eine datei oder ein ordner ist, wird alles in alphabetischen ordnung angezeigt.

Ich würde mich freuen, wenn sie mir irgendeinen hilfreichen tipp geben könnten um dieses Feature realisieren zu können.

Mein ansatz bisher war, in der Filterfunktion, vor dem Return-Statement einen Collections.sort() befehl auf die directoryListe anzuwenden, was mir erfolgereich mislungen ist. Könnte auch an meinen nicht all zu tiefen programmierkenntnissen liegen, jedenfalls wäre jeder art hilfe zu o.g. fragestellung wilkommen.

Mit freundlichen Grüßen,
eXti
 
Wenn du eine Sortierung haben möchtest, dann musst du die Dateien in eine TreeMap packen und per Comparator sortieren lassen.

Ich habe dir da mal ein Beispiel gemacht. Es wird hier nach dem Dateiende sortiert:
Code:
/**
 * 
 */

import java.io.File;
import java.util.ArrayList;

import java.util.Comparator;
import java.util.TreeMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

/**
 * @author Manuel Beck
 * 
 */
public class JTreeDirectoryView extends JFrame {

    File root;

    
        
    public JTreeDirectoryView() {
        super("JTreeDirectoryView");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JTree tree = new JTree();
        buildTreeModelAccordingToDirectoryStructure(root = new File("C:/"),
                tree);

        add(new JScrollPane(tree));

        tree.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                FileSystemTreeNode treeNode = (FileSystemTreeNode)e.getNewLeadSelectionPath().getLastPathComponent();
                File f = (File)treeNode.getUserObject();
                
                System.out.println("Gewählte Datei: " + f.getName());
                System.out.println("Ist ein Ordner: " + f.isDirectory());
            } 
        });
        
        pack();
        setVisible(true);
    }

    void buildTreeModelAccordingToDirectoryStructure(File file, JTree tree) {
        tree.setModel(new DefaultTreeModel(new FileSystemTreeNode(file)));
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new JTreeDirectoryView();
    }

    class FileSystemTreeNode extends DefaultMutableTreeNode {
 Comparator comparator = new Comparator() {

            public int compare(Object o1, Object o2) {
 
                File file1 = (File)o1;
                File file2 = (File)o2;
                             
                if (file1.isDirectory() && file2.isDirectory()){
                    return file1.getName().compareTo(file2.getName());
                } else if (file1.isDirectory()){
                    return -1;
                }
                else if (file2.isDirectory()) {
                    return +1;
                }                                

                int point1 = file1.getName().lastIndexOf(".");
                int point2 = file2.getName().lastIndexOf(".");
                
                if (point1 == -1 || point2 == -1) return -1;
                
                String fileEnd1 = file1.getName().substring(point1+1, file1.getName().length()-1).toLowerCase();
                String fileEnd2 = file2.getName().substring(point2+1, file2.getName().length()-1).toLowerCase();

                
                int result =  fileEnd1.compareTo(fileEnd2);
                
                if (result == 0) return file1.getName().compareTo(file2.getName());
                
                return result;

            }
        };
       
        ArrayList<File> currentFiles;

        public FileSystemTreeNode(File file) {
            setUserObject(file);
        }

        public int getChildCount() {
            filterDirectories((File) getUserObject());

            if (currentFiles == null) {
                return 0;
            }
            
            return currentFiles.size();
        }

        public TreeNode getChildAt(int index) {
            filterDirectories((File) getUserObject());

            return new FileSystemTreeNode(currentFiles.get(index));
        }

        public boolean isLeaf() {
            
            if (((File)getUserObject()).isFile()) return true;
            return false;
        }

        public String toString() {
            String string = ((File) getUserObject()).getName();
            if (getUserObject() == root) {
                string = ((File) getUserObject()).getAbsolutePath();
            }
            return string;
        }

        private void filterDirectories(File file) {

            TreeMap directoryList = new TreeMap(comparator);

            if (file.isDirectory()) {

                File[] files = file.listFiles();

                for (int i = 0; i < files.length; i++) {

                    directoryList.put(files[i], files[i]);
                                
                }

                currentFiles = new ArrayList<File>();
                for(Object o: directoryList.values()) {
                    File f = (File)o;
                    
                    currentFiles.add(f);
                }
            } else {
                currentFiles = new ArrayList<File>();
                currentFiles.add(file);
            }
        }

    }
}

Gruß, Manuel
 
Zuletzt bearbeitet:
Hier habe ich nochmal meine Lösung zu meiner Frage, wie man feststellt welche Datei ausgewählt wurde:
Code:
tree.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                FileSystemTreeNode treeNode = (FileSystemTreeNode)e.getNewLeadSelectionPath().getLastPathComponent();
                File f = (File)treeNode.getUserObject();
                
                System.out.println("Gewählte Datei: " + f.getName());
                System.out.println("Ist ein Ordner: " + f.isDirectory());
            } 
        });

Gruß, Manuel
 

Neue Beiträge

Zurück