JTree aus List<File> erstellen

subn0de

Mitglied
Hallo,

aus einer List<File> möchte ich einen JTree erstellen. Hat jemand eine Idee, wie ich die Knoten aus dieser Liste erstellen könnte?
 

subn0de

Mitglied
ganz normal, kannst du es denn mit List<String> usw?
Nein, sonst würde ich die List<File> in Strings konvertieren.
schaue dir Tutorials an, z.B.
How to Use Trees (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
dann baue deinen Baum so auf, wie du es für richtig hälst,
aus den Files kannst du Verzeichnisse zur Zuordnung und Dateinamen zur Anzeige extrahieren,
Genau da liegt mein Problem: ich weiss nicht wie ich die Verzeichnisse extrahieren soll, sodass ich einen Knoten daraus erstellen kann.
Ich habe folgendes in einem Beispiel-JTree-Browser gefunden:
Java:
 public Object getChild(Object parent, int index) {
    File directory = (File) parent;
    String[] directoryMembers = directory.list();
    return (new File(directory, directoryMembers[index]));
  }

  public int getChildCount(Object parent) {
    File fileSystemMember = (File) parent;
    if (fileSystemMember.isDirectory()) {
      String[] directoryMembers = fileSystemMember.list();
      return directoryMembers.length;
    }

    else {

      return 0;
    }
  }
Wie muss ich denn hin- und herparsen, damit ich alle Member beispielsweise aus "c:\" herausfinde, wenn ich zB "c:\home\subn0de\Documents\foo.bar" habe, und
+-"c:\"
....+-/home
........ +-/subn0de
............ +-/Documents
................ +-/foo.bar
brauche?
oder möchtest du dynamisch ein Live-Bild der Festplatte a la Dateiexplorer bauen?
Es soll schon a la Dateiexplorer sein, nur eben kein Abbild der Festplatte sein, sondern aus einer Auswahl an Dateien bestehen, zB alle über 100MB, daher auch die Liste.
 
S

SlaterB

Gast
denke zunächst nicht an JTree, sondern an ein Konsolen-Programm,
baue eins mit Ausgabe

Root:
c:\
Kinder:
home
auswärts
netzwerk

Verzeichnis:
home
Kinder:
subn0de
SlaterB
andere liebe Besucher

Verzeichnis:
..
Kinder:
..

-------

dazu ist deine Aufgabe, die Liste der Dateien zu analysieren,
Verwende eine Map<String oder File, List<String oder File>>

arbeite die Liste der Files einen Eintrag nach dem anderen durch,
zu jedem File holst du dir den Pfad (in API nachschauen),
den Pfad trennst du nach Dateinamen/ Oberverzeichnis und fügst die Datei/ das File in die Liste in der Map zum Verzeichnis-String ein (Liste erstellen wenn noch nicht vorhanden)

das Verzeichnis kannst du auch noch nach allen '/' oder '\' einzeln aufteilen und jeweils das Unterverzeichnis in der Map dem Oberverzeichnis zuordnen,
ob du als Key in der Map nur den aktuellen Verzeichnis-Namen (z.B. home) oder den vollen Pfad (c:\home) oder das File-Objekt nimmst, bleibt die überlassen,
bedenke, ob es doppelte Verzeichnisse gibt,
c:\home
c:\x\y\home

Root-Verzeichnisse merhe dir gesondert, falls wichtig,
am Ende die Map auf verschiedene Weisen angehen, z.B. vom gemerkten Root-Key aus,

wenn du die Map einigermaßen kontrolliert ausgeben kannst, in der nächste Schritt dann Umwandlung in JTree
 

subn0de

Mitglied
Vielen Dank für Deinen Tip. Vermutlich ist des Puzzles Lösung die Map, sie war mir nicht geläufig. Ich werde mich hineinlesen und dann wieder hier Posten (hoffentlich die Lösung).
 

subn0de

Mitglied
Ich komme noch auf keinen grünen Zweig. Wie würdet Ihr das denn angehen, welche Maps würdet ihr benutzen, wären HashMaps gut oder HashSets besser, oder bin ich da ganz auf dem falschen Weg?
 
S

SlaterB

Gast
HashSet ist keine Map, insofern ein falscher Weg,
welche Map ist komplett egal, eine TreeMap hätte was von JTree, bei meinem Ansatz wird dieser Aufbau aber überhaupt nicht genutzt,
was durchaus noch denkbar wäre:
wenn du c:\x\y\home hast, dann ist c:\ immer noch root, x in erste Ebene, y in zweiter Ebene, home in dritter,
eine Information die in meinem letzten Post gar nicht vorkam

(edit: Quatsch, eine TreeMap hängt nicht wie ein JTree genau von den Stufen ab, verwirrt hier wohl mehr, welche Map ist immer noch egal, HashMap ist ok)

wie auch immer, viele Wege führen nirgendwo hin, wenn du noch über die Wahl der Map oder anderer Dinge nachdenkst hast du anscheinend noch gar nichts programmiert, so gehts nicht voran, hab schon ziemlich viel verraten,

programmiere doch ein bisschen, poste einen Ansatz, stelle eine sinnvolle Frage zu einem Detail welches du nicht verstehst
oder ähnliches
 
Zuletzt bearbeitet von einem Moderator:

subn0de

Mitglied
Guten Morgen,

Ich habe nun einen Ansatz auf String-Ebene, ist aber noch nicht ganz fertig. Würde mich über Kritik freuen. Inwiefern mir eine Map helfen könnte, habe ich noch nicht kapiert, bitte gib mir noch einen Tip Slater_B.
Nodes.java
Java:
/*
*HINWEIS:
*Die Datei-Objekte sind für Unix formatiert ("file:/"), daher weiss ich nicht ob sich das in Windows ("file:/c:/"??)testen lässt. 
*Die Dateien müssen nicht existieren.
*/
import java.io.File;
import java.util.ArrayList;
import java.util.*;
import java.util.List;
import java.util.Map;


public class Nodes {
    static List<File> filelist = new ArrayList<File>();
    static Map<Integer, File> fileMap;
    public static void main(String args[]) {
        File f1 = new File("file:/home/subn0de/test");
        File f2 = new File("file:/home/subn0de/test01");
        File f3 = new File("file:/home/subn0de/Downloads/asdf");
        File f4 = new File("file:/home/subn0de/Downloads/skydomes/5313_Filey.png");
        File f5 = new File("file:/home/subn0de/1/2/3/winzig");
        filelist.add(f1);
        filelist.add(f2);
        filelist.add(f3);
        filelist.add(f4);
        filelist.add(f5);
        File home = new File("file:/home");
        File root = new File("file:/");
        System.out.println(root);
        System.out.println(filelist);
        for(int i=0;i<filelist.size();i++) {
            if (filelist.get(i)!=null) {
                StringBuilder parentsb = new StringBuilder(), parentsb2 = new StringBuilder();
                parentsb.append(filelist.get(i));                                                                                                                                                //copy file to stringbuilder
                if (parentsb.indexOf("/")!=parentsb.lastIndexOf("/")) {                                                                                                           //wenn Pfad.length > 0
                    parentsb2.append(parentsb, parentsb.indexOf("/"), parentsb /**DONE <-- NullPointer in here */                                    //nächsthöherer knoten             
                            .lastIndexOf("/"));
                    File parent = new File("file:/" + parentsb2);
                    String parentContains=parent.toString();
                    System.out.println("Knoten:\n" + parent + "\nKinder:\n");
                    for (int i2 = 0; i2 < filelist.size(); i2++) {
                        /**
                         * TODO
                         * - für jedes Blatt im Knoten, wird der Knoten zusätzlich dargestellt. java.util.set anschauen oder Liste zum Abgleich.
                         * - Knoten ohne Blätter werden nicht angezeigt
                         */
                        if  (
                                filelist.get(i2).toString().contains(parentContains)  /**File ist Kind von parentFile*/
                         &&
                                filelist.get(i2).toString().lastIndexOf("/")<=parentContains.length()+1 /**Kind != Kind von Kinderknoten*/
                         &&
                                filelist.get(i2).toString().length()>parentContains.length()+1 /**Kind != parent*/
                        ){
                           System.out.println("     +-"+filelist.get(i2));
                           
                        }//end if filelist.get(i2).toString().contains(parentContains) 
                    }//end  for (int i2 = 0; i2 < filelist.size(); i2++) {
                }//end if (parentsb.indexOf("/")!=parentsb.lastIndexOf("/")) {
            }//end if (filelist.get(i)!=null) {
        }//end for(int i=0;i<filelist.size();i++) {
        
    } //end main
} //end class
/** TODO:
 * - sortieren
 * - mehrfache nodes,so.
 */
console.output
Java:
file:
[file:/home/subn0de/test, file:/home/subn0de/test01, file:/home/subn0de/Downloads/asdf, file:/home/subn0de/Downloads/skydomes/5313_Filey.png, file:/home/subn0de/1/2/3/winzig]
Knoten:
file:/home/subn0de
Kinder:

     +-file:/home/subn0de/test
     +-file:/home/subn0de/test01
Knoten:
file:/home/subn0de
Kinder:

     +-file:/home/subn0de/test
     +-file:/home/subn0de/test01
Knoten:
file:/home/subn0de/Downloads
Kinder:

     +-file:/home/subn0de/Downloads/asdf
Knoten:
file:/home/subn0de/Downloads/skydomes
Kinder:

     +-file:/home/subn0de/Downloads/skydomes/5313_Filey.png
Knoten:
file:/home/subn0de/1/2/3
Kinder:

     +-file:/home/subn0de/1/2/3/winzig
 
S

SlaterB

Gast
soviel macht die Map gar nicht, wenn man dein Programm voraussetzt könnte man es lediglich als Zwischenspeicher bezeichnen,

für den Parent 'file:/home/subn0de' hast du zwei Dateien, es wird zweimal haargenau dieselbe Ausgabe getätigt,
bei 10 Dateien in diesem Verzeichnis wäre das ziemlich nervig

würdest du beim ersten Auffinden dieser 10 Dateien zum Parent die Zuordnung in der Map speichern, müsstest du das nächstes Mal nicht wiederholen,
ganz grob in folgender Modifikation zu sehen:
(ich musste unter Windows / zu \\ machen)
Java:
public class Test {
    public static void main(String[] args)  {
        Nodes.main(null);
    }
}

class Nodes {
    static List<File> filelist = new ArrayList<File>();
    static Map<String, List<File>> fileMap = new HashMap<String, List<File>>();

    public static void main(String args[])
    {
        File f1 = new File("file:/home/subn0de/test");
        File f2 = new File("file:/home/subn0de/test01");
        File f3 = new File("file:/home/subn0de/Downloads/asdf");
        File f4 = new File("file:/home/subn0de/Downloads/skydomes/5313_Filey.png");
        File f5 = new File("file:/home/subn0de/1/2/3/winzig");
        filelist.add(f1);
        filelist.add(f2);
        filelist.add(f3);
        filelist.add(f4);
        filelist.add(f5);
        File home = new File("file:/home");
        File root = new File("file:/");
        System.out.println(root);
        System.out.println(filelist);
        for (int i = 0; i < filelist.size(); i++)
        {
            StringBuilder parentsb = new StringBuilder(), parentsb2 = new StringBuilder();
            parentsb.append(filelist.get(i));
            if (parentsb.indexOf("\\") != parentsb.lastIndexOf("\\"))
            {
                parentsb2.append(parentsb, parentsb.indexOf("\\"), parentsb.lastIndexOf("\\"));
                File parent = new File("file:/" + parentsb2);
                String parentContains = parent.toString();
                System.out.println("untersuche parent: " + parentContains);
                if (fileMap.containsKey(parentContains))
                {
                    System.out.println("parent schon bekannt, tschüss");
                    continue;
                }
                List<File> childs = new ArrayList<File>();

                for (int i2 = 0; i2 < filelist.size(); i2++)
                {
                    File f = filelist.get(i2);
                    String fst = f.toString();
                    if (fst.contains(parentContains) && fst.lastIndexOf("\\") <= parentContains.length() + 1
                        && fst.length() > parentContains.length() + 1)
                    {
                        childs.add(f);
                    }
                }
                fileMap.put(parentContains, childs);
                System.out.println("saved " + childs.size() + " childs for " + parentContains);
            }
        }

        for (String key : fileMap.keySet())
        {
            System.out.println("key: " + key + ", " + fileMap.get(key));
        }

    }
}
Ausgabe
Code:
file:
[file:\home\subn0de\test, file:\home\subn0de\test01, file:\home\subn0de\Downloads\asdf, file:\home\subn0de\Downloads\skydomes\5313_Filey.png, file:\home\subn0de\1\2\3\winzig]
untersuche parent: file:\home\subn0de
saved 2 childs for file:\home\subn0de
untersuche parent: file:\home\subn0de
parent schon bekannt, tschüss
untersuche parent: file:\home\subn0de\Downloads
saved 1 childs for file:\home\subn0de\Downloads
untersuche parent: file:\home\subn0de\Downloads\skydomes
saved 1 childs for file:\home\subn0de\Downloads\skydomes
untersuche parent: file:\home\subn0de\1\2\3
saved 1 childs for file:\home\subn0de\1\2\3
key: file:\home\subn0de\1\2\3, [file:\home\subn0de\1\2\3\winzig]
key: file:\home\subn0de\Downloads\skydomes, [file:\home\subn0de\Downloads\skydomes\5313_Filey.png]
key: file:\home\subn0de\Downloads, [file:\home\subn0de\Downloads\asdf]
key: file:\home\subn0de, [file:\home\subn0de\test, file:\home\subn0de\test01]

-----

nach meiner Idee würde die Map etwas anders eingesetzt werden,
da speichert man zu einem Parent nur die aktuelle Datei in der Liste, sucht nicht mit einer weiteren Schleife gleich alle weiteren passenden Dateien,
sondern einfach nur die Liste genau einmal durchlaufen, wenn dann wieder eine Datei zu einem schon bekannten Parent kommt,
dann in der Map in die schon vorhandene Liste hinzufügen, hatte ich ja alles schon geschrieben

------

du musst dich aber auch nicht zwanghaft an die Map halten, nur eine Idee von vielen,
dein Programm ist auch schon recht weit, damit stehst du vom ursprünglichen Stand aus
> Genau da liegt mein Problem: ich weiss nicht wie ich die Verzeichnisse extrahieren soll, sodass ich einen Knoten daraus erstellen kann.
schon weitaus besser da

ein wichtiger Punkt ist allerdings noch, die Oberverzeichnisse weiter zu zerlegen,
falls nicht /home/subn0de/test + /home/subn0de/Downloads/asdf zwei unterschiedliche root-Knoten im JTree sein sollen,
musst du sie Schicht um Schicht auseinandernehmen, das gemeinsame Verzeichnis /home/subn0de feststellen,
dafür jedesmal mit der zweiten Schleife alle zugehörigen Dateien suchen wäre ungünstig

lieber wirklich nur eine Schleife über die File-Liste, jede Datei genau einmal untersuchen,
eine innere Schleife braucht es aber schon über die zerlegten Ebenen /home/subn0de/Downloads, /home/subn0de/, /home usw.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrittenFritze JTree, LazyLoading und "Rückwärtstraversion" AWT, Swing, JavaFX & SWT 3
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
W Swing Anzeigefehler bei JTree AWT, Swing, JavaFX & SWT 1
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
H Swing JTree: Zählt der rootNode mit? AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
R JTree behandeln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
T JTree mit Symbolen? AWT, Swing, JavaFX & SWT 8
R Anfängerfrage: Ansichten des JTree AWT, Swing, JavaFX & SWT 1
H Swing JTree Minimumgröße AWT, Swing, JavaFX & SWT 2
F Swing JTree + DiffUtils // Markierung Nodes aufheben AWT, Swing, JavaFX & SWT 2
I JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Swing JTree AWT, Swing, JavaFX & SWT 4
M Nodes in JTree nicht anzeigen AWT, Swing, JavaFX & SWT 0
T JTree mit Cloud verbinden AWT, Swing, JavaFX & SWT 0
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
S Swing JTree verwirrt mich AWT, Swing, JavaFX & SWT 2
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
J JTree speichern AWT, Swing, JavaFX & SWT 4
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
B JTree mit Ordneransicht in JPanel einbinden AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
V Swing JTree - Umbenennen selbst handlen. AWT, Swing, JavaFX & SWT 2
E Übergebenem JTree Blätter hinzufügen AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
A Swing JTree - Nodes expanden AWT, Swing, JavaFX & SWT 2
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
B JTree AWT, Swing, JavaFX & SWT 9
T Menüacceleratoren verschwinden bei JTree AWT, Swing, JavaFX & SWT 5
1 Swing JTree collapse child nodes AWT, Swing, JavaFX & SWT 4
B JTree - sehr individuell AWT, Swing, JavaFX & SWT 3
G Swing JTree - Verbindungslinien entfernen AWT, Swing, JavaFX & SWT 4
A Swing Herausfinden ob bei JTree Klick auf "+"/"-" anahnd x,y AWT, Swing, JavaFX & SWT 2
S Swing JTree und seine Listener... AWT, Swing, JavaFX & SWT 4
L Swing JTree wird nicht selektiert AWT, Swing, JavaFX & SWT 2
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
A JTree aus Pfaden erzeugen AWT, Swing, JavaFX & SWT 3
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
X Datensätze in JTree AWT, Swing, JavaFX & SWT 2
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
E JTree Auswahl AWT, Swing, JavaFX & SWT 2
K JTree width der Treenodes auf 100% AWT, Swing, JavaFX & SWT 6
C JTree LastSelectedPathComponent benutzen? AWT, Swing, JavaFX & SWT 3
S Swing JTree Node Text nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
Landei Swing JTree mit "Tabellenzeilen"? AWT, Swing, JavaFX & SWT 5
Rudolf Swing JTree Node anhand vom Namen finden AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
Z JTree rootChilds AWT, Swing, JavaFX & SWT 2
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
E Swing JTree AWT, Swing, JavaFX & SWT 2
J Swing Lazy Loading in JTree wenn gescrollt wird AWT, Swing, JavaFX & SWT 3
N Knotenanordnung in JTree AWT, Swing, JavaFX & SWT 4
S JTree mit Liste zur Speicherung AWT, Swing, JavaFX & SWT 3
S Jtree CheckNode mit JPanel AWT, Swing, JavaFX & SWT 32
G JTree entfernt Nodes nicht AWT, Swing, JavaFX & SWT 12
C Swing JTree und TreeModel AWT, Swing, JavaFX & SWT 15
S Swing JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
J JTree AWT, Swing, JavaFX & SWT 2
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
E Swing JTree setSelectedPath funktioniert nicht?! AWT, Swing, JavaFX & SWT 5
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
C Swing MouseEntered(?) für jeden Node im JTree AWT, Swing, JavaFX & SWT 4
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
C Swing JTree UI Probleme AWT, Swing, JavaFX & SWT 6
G JTree - Observer oder Listener? AWT, Swing, JavaFX & SWT 6
L Swing [JTree] Selektierte Nodes nummerieren AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben