listFiles()
File hat die Methode, gehst einfach mit mehreren Schleifen (oder rekursiv) die einzelnen Parents, Unterdateien/ordner durch und packst sie in den Tree.Code:listFiles()
Wie man ein JTree benutzt ist hier gut erklärt:
http://www.java-forum.org/java-faq-beitraege/23431-jtree-ubersicht-teil-1-teil-6-a.html
oder auf der Javainsel![]()
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.19 Bäume (JTree)
getParentFile()
Also möchtest du einen Knoten für "C" haben
einen für "Test" und so weiter ...
File.separator
File.pathSeparator
File.separator
Bitte parse nicht mit "\" ....
nimm lieber(wobei ich gerade nicht weiß wo der Unterschied zwischenCode:File.separator
undCode:File.pathSeparator
ist).Code:File.separator
So ein ähnliches Problem hatte ich auch,
damals habe ich einfachen eine Liste aller Nodes gehabt und habe beim einfügen geprüft,
ob diese Node schon existiert.
Es gibt sicherlich effektivere Algorithmen ....
mir fällt gerade nur keiner ein ^^
Wenn Du das als String vorliegen hast musst Du vermutlich diese manuell zerlegen und überprüfen welche Info zum selben Knoten gehört.Ich habe mehrer Strings, z.B. "C:\test\test1\test.txt" oder "C:\test\test2\test.txt" und will erreichen, dass der JTree einen Knoten C hat, darunter den Knoten test, dann test1, usw.
Wenn Du das als String vorliegen hast musst Du vermutlich diese manuell zerlegen und überprüfen welche Info zum selben Knoten gehört.
Woher kommen denn die Strings? Sind die fest vorgegeben oder werden die durch Auslesen eines Ordners erzeugt?
So ein ähnliches Problem hatte ich auch,
damals habe ich einfachen eine Liste aller Nodes gehabt und habe beim einfügen geprüft,
ob diese Node schon existiert.
Es gibt sicherlich effektivere Algorithmen ....
mir fällt gerade nur keiner ein ^^
import java.io.*;
import javax.swing.*;
import javax.swing.tree.*;
public class FileTreeDemo extends JFrame {
private int maxDepth = 2;
private int curDepth = 0;
public FileTreeDemo() {
File rootFile = new File("C:\\test");
JTree tree = new JTree(this.getNode(rootFile));
this.getContentPane().add(new JScrollPane(tree));
}
private DefaultMutableTreeNode getNode(File file) {
curDepth++;
DefaultMutableTreeNode node = new DefaultMutableTreeNode(file.getName());
File[] list = file.listFiles();
for (int i = 0; i < list.length; i++) {
if (list[i].isFile()) {
if (list[i].getName().endsWith(".txt"))
node.add(new DefaultMutableTreeNode(list[i].getName()));
} else if (curDepth<maxDepth){
node.add(this.getNode(list[i]));
}
else {
DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(list[i].getName());
subNode.add(new DefaultMutableTreeNode("...noch nicht ausgelesen"));
node.add(subNode);
}
}
curDepth--;
return node;
}
public static void main(String[] args) {
JFrame frame = new FileTreeDemo();
frame.setBounds(0, 0, 500, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
@Michael
Du hast jetzt nur ein Verzeichnis angegegen.
Ich möchte mehrere Verzeichnisse, die aus einer anderen Methode kommen, in dem Tree darstellen.
Dabei geht es nicht um eine maximale Tiefe, sondern immer bis zum Ende eines Pfades. Das können dann manchmal 5 Unterverzeichnisse sein, manchmal auch nur eins.
MfG
ice_gixxe
Das war ja nur ein Bsp. und darf nach belieben verändert werden.
Die maximale Verzeichnistiefe habe ich nur eingegeben, damit die JVM bei zu umfangreichen Verzeichnissen sich nicht totläuft - kann (auf eigenes Risiko ;-))entfernt werden.
Auch kann man mehrere Verzeichnisse durchlaufen, dann muss man das ganze halt nur in eine Schleife packen.
Wenn man den Tree nach dem Einlesen aufgrund der Pfade erzeugen will muss man immer erst vergleichen existiert der (Teil)Pfad bereits im Tree, usw.da ich vollständige Pfade bereits habe, d.h. von C: bis zu der Datei. Es geht jetzt nur noch darum, diese in den Tree zu packen.
Wenn man den Tree nach dem Einlesen aufgrund der Pfade erzeugen will muss man immer erst vergleichen existiert der (Teil)Pfad bereits im Tree, usw.
Das geht dann nicht so komfortabl, als wenn man den Tree direkt beim Einlesen erzeugt