Alle Kinder eines JTree bekommen

Status
Nicht offen für weitere Antworten.

tingel

Mitglied
Hallo,

ich folgenes Problem:
Ich habe einen JTree mit einem TreeModel. Das TreeModel enthält die Verzeichnisstruktur des Computers. Also z.B. C:\ und alle Verzeichnisse und Dateien da drunter. Jetzt will ich wenn ein JButton gedrückt wird ab einen Knoten, der selektiert wurde, z.B. C:\ Programme, alle Verzeichnisse und Dateien rekursiv ermitteln. Mit getChild(Object parent, int index) bekomme ich nur den Wert null egal was ich selektiert habe.

Kann mir jemand helfen?

Jetzt noch ein Auszug aus meinem Programm:

Code:
        ...
        JTree rootSelectionTree = new JTree();
        String rootNames[];
        File[] rootFiles = File.listRoots();
        if(rootFiles!=null){
            rootNames = new String[rootFiles.length];
        }

        File root = new File(rootNames[selectedIndex]);
        DLP_FileTreeModel model = new DLP_FileTreeModel(root);
        rootSelectionTree.setModel(model);

        tsm = new DefaultTreeSelectionModel();
        tsm.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        rootSelectionTree.setSelectionModel(tsm);
        ...

Code:
import javax.swing.tree.TreeModel;
import java.io.File;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreePath;

class DLP_FileTreeModel implements TreeModel {
    protected File root;
    public dnp_FileTreeModel(File root){
        this.root = root;
    }
    /**
     * Adds a listener for the <code>TreeModelEvent</code> posted after the
     * tree changes.
     *
     * @param l the listener to add
     */
    public void addTreeModelListener(TreeModelListener l) {
    }

    /**
     * Returns the child of <code>parent</code> at index <code>index</code>
     * in the parent's child array.
     *
     * @param parent a node in the tree, obtained from this data source
     * @param index int
     * @return the child of <code>parent</code> at index <code>index</code>
     */
    public Object getChild(Object parent, int index) {
        String[] children = ((File)parent).list();
        if((children == null) || (index >= children.length)){
            return null;
        }
        return new File((File) parent, children[index]);
    }

    /**
     * Returns the number of children of <code>parent</code>.
     *
     * @param parent a node in the tree, obtained from this data source
     * @return the number of children of the node <code>parent</code>
     */
    public int getChildCount(Object parent) {
        String[] children = ((File)parent).list();
        if(children == null){
            return 0;
        }
        return children.length;
    }

    /**
     * Returns the index of child in parent.
     *
     * @param parent a note in the tree, obtained from this data source
     * @param child the node we are interested in
     * @return the index of the child in the parent, or -1 if either
     *   <code>child</code> or <code>parent</code> are <code>null</code>
     */
    public int getIndexOfChild(Object parent, Object child) {
        String[] children = ((File)parent).list();
        if(children == null){
            return -1;
        }
        String childrenname = ((File)child).getName();
        for(int i=0; i < children.length;++i){
            if(childrenname.equals(children[i])){
                return i;
            }
        }
        return -1;
    }

    /**
     * Returns the root of the tree.
     *
     * @return the root of the tree
     */
    public Object getRoot() {
        return root;
    }

    /**
     * Returns <code>true</code> if <code>node</code> is a leaf.
     *
     * @param node a node in the tree, obtained from this data source
     * @return true if <code>node</code> is a leaf
     */
    public boolean isLeaf(Object node) {
        return ((File)node).isFile();
    }

    /**
     * Removes a listener previously added with
     * <code>addTreeModelListener</code>.
     *
     * @param l the listener to remove
     */
    public void removeTreeModelListener(TreeModelListener l) {
    }

    /**
     * Messaged when the user has altered the value for the item identified
     * by <code>path</code> to <code>newValue</code>.
     *
     * @param path path to the node that the user has altered
     * @param newValue the new value from the TreeCellEditor
     */
    public void valueForPathChanged(TreePath path, Object newValue) {
    }
}

Danke schonmal im Voraus.
 

meez

Top Contributor
Sowas:

Code:
	public void getRecursiveNodes(DefaultMutableTreeNode node, List nodes) {
		DefaultMutableTreeNode t;
		for (Enumeration e = node.children(); e.hasMoreElements();) {
			t = (DefaultMutableTreeNode) e.nextElement();
			if (t.isLeaf())  {
				nodes.add(t);		
				continue;
			}	
			//Kommentar weg, wenn du auch die Knoten willst
			//nodes.add(t);
			getRecursiveNodes(t, nodes);
		}
	}
 
T

tinge

Gast
Ich habe nur keine DefaultMutableTreeNode. Ansonsten ist das schon sowas, was ic h wollte. Werde damit mal ein wenig rumspielen.
 

tingel

Mitglied
Wenn ich jetzt getRecursiveNodes(DefaultMutableTreeNode node) mit meinem TreeModel aufrufe, bekomme ich beim kompilieren die Fehlermeldung:
Code:
"DLP_MigrationDialog.java".ger RecursiveNodes(javax.swing.tree.DefaultMutableTreeNode) in DLP_MigrationDialog kann auf () nicht angewendet werden in Zeile ...

Heißt das, dass mein Modell leer ist?
 

meez

Top Contributor
hmm? () :bahnhof:

Die Liste musst du auch mitgeben:

Code:
List nodes = new ArrayList();
DefaultMutableTreeNode  node = ...;
getRecursiveNodes(node, nodes);
//Ab hier hast du in der Liste (nodes) alle nodes unterhalb von "node"
 

tingel

Mitglied
Das mit der List hilft nicht.

Code:
...
    public void createInformationButton_actionPerformed(ActionEvent e) {
        ArrayList nodes = new ArrayList();
        DLP_GetRekursiveNodes grn = new DLP_GetRekursiveNodes();
        grn.getRecursiveNodes(model, nodes);
    }
...

Wobei model das FileTreeModel ist.[/code]
 

tingel

Mitglied
Wie schon geschrieben, ich habe kein DefaultMutableTreeNode sondern nur ein TreeModel, welches das "Dateisystem" enthält.
 
B

Beni

Gast
Also sowas funktioniert bei mir um mal die erste Ebene auszugeben:
Code:
public void actionPerformed( ActionEvent e ) {
                TreePath path = tree.getSelectionPath();
                
                int count = model.getChildCount( path.getLastPathComponent() );
                for( int i = 0; i < count; i++ ){
                    System.out.println( model.getChild( path.getLastPathComponent(), i ) );
                }
            }
Dein eigener Code wäre natürlich hilfreich :wink:

P.S. Dein TreeModel hat wirklich sehr viele "new"s und sehr viele "list"-Aufrufe. Speicher doch die Resultate im Model, anstatt sie immer wieder neu zu berechnen. Das könnte dein Programm auch schneller machen.
 

meez

Top Contributor
tingel hat gesagt.:
Wie schon geschrieben, ich habe kein DefaultMutableTreeNode sondern nur ein TreeModel, welches das "Dateisystem" enthält.

Wo ist das Problem?
Ueber das Model kommst du ja ohne Probleme an den Node...
 

tingel

Mitglied
Danke für eure Hilfe.
Ich habe das jetzt folgendermaßen gelöst:
Code:
public void getChilds( TreeModel treeModel, TreePath treePath ) {
    TreePath path = tree.getSelectionPath();
                
    int count = treeModel.getChildCount( treePath.getLastPathComponent() );
    for( int i = 0; i < count; i++ ){
        if(model.isLeaf(model.getChild(treePath.getLastPathComponent(),i))){
            System.out.print(treePath.pathByAddingChild(treePath.getLastPathComponetn(),i)).getLastPathComponent());
            System.out.println(" is leaf");
        }
        else {
             System.out.print(treePath.getLastPathComponent());
             System.out.println(" is path");
             TreePath tp = new TreePath(model.getChild( path.getLastPathComponent(), i ));
              getChilds(model,tp);
          }
      }
}

Der Aufruf sieht dabei dann wie folgt aus:
Code:
...
TreePath treePath = rootSelectionTree.getSelectionPath();
DLP_GetRekursiveNodes grn = new DLP_GetRekursiveNodes();
grn.getChilds(model,treePath);
...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Hauptfenster und alle Kinder schließen? AWT, Swing, JavaFX & SWT 7
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
_user_q JavaFX Wie kann ich alle Objekte außer eins deaktivieren (das Gleiche mit BoxBlur)? AWT, Swing, JavaFX & SWT 11
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
D JavaFX Alle Knöpfe auf die gleiche Größe AWT, Swing, JavaFX & SWT 14
M Gui-Form alle Labels anzeigen AWT, Swing, JavaFX & SWT 4
M Alle Schriftarten in JComboBox AWT, Swing, JavaFX & SWT 5
X Swing setContentPane verdeckt mir alle Buttons Labels etc... AWT, Swing, JavaFX & SWT 14
N Swing Alle Objekte anzeigen auch bei JPanel-Überlappung AWT, Swing, JavaFX & SWT 6
Bluedaishi JTable alle Zeilen löschen AWT, Swing, JavaFX & SWT 7
J CellEditorListener wird für ALLE Zellen ausgeführt AWT, Swing, JavaFX & SWT 2
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
A JDialog (modal) blockiert alle Fenster! AWT, Swing, JavaFX & SWT 2
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
C Swing JTattoo - Look and Feel für ALLE User AWT, Swing, JavaFX & SWT 5
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
O JFrame: Daten alle paar Sekunden aktualisieren AWT, Swing, JavaFX & SWT 3
X Alle Components eines JPanels Enablen AWT, Swing, JavaFX & SWT 7
AyKay SWT (alle) Listener bzw. ModifyEventListener entfernen AWT, Swing, JavaFX & SWT 2
D Funktion JList.getSelectedValues() gibt nicht alle values zurück AWT, Swing, JavaFX & SWT 2
E Swing TableCellRenderer für alle Splaten setzen?! AWT, Swing, JavaFX & SWT 3
V Alle offenen jDialoge schliessen AWT, Swing, JavaFX & SWT 3
M Alle Frame Methoden AWT, Swing, JavaFX & SWT 2
L 3D-Grafik Java3D - Alle SceneGraphObjects geordnet erhalten AWT, Swing, JavaFX & SWT 2
F Nicht alle Bilder werden angezeigt AWT, Swing, JavaFX & SWT 2
Iron Monkey Alle Anwendungen werden miniert AWT, Swing, JavaFX & SWT 2
D ALLE exceptions in Log fenster anzeigen AWT, Swing, JavaFX & SWT 17
C JTable: Alle selektierten Zellen abfangen AWT, Swing, JavaFX & SWT 13
J alle Ordner in einem Ordner anzeigen(Jlist) AWT, Swing, JavaFX & SWT 44
M Swing Dankeschön an alle AWT, Swing, JavaFX & SWT 8
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
kodela alle Buttons einer ToggleButtonGroup deselektieren AWT, Swing, JavaFX & SWT 2
Milady Annzeigen alle Daten aus der Tabelle AWT, Swing, JavaFX & SWT 6
B MDI Anwendung alle maximierten InternalFrames in Tabs AWT, Swing, JavaFX & SWT 3
J Swing Monospace-Schrift für alle Systeme AWT, Swing, JavaFX & SWT 3
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
J Swing Eine(und zwar ein und die selbe) WindowListener Instanz für alle JFrames AWT, Swing, JavaFX & SWT 8
J Swing Alle JFrames AWT, Swing, JavaFX & SWT 18
aze JTextfield nur so breit dass alle zeichen sichtbar sind AWT, Swing, JavaFX & SWT 2
R Swing alle Frames nutzen das gleiche Model AWT, Swing, JavaFX & SWT 2
André Uhres Swing Alle Komponenten eines JPanel aktivieren/deaktivieren AWT, Swing, JavaFX & SWT 4
E Im Frame alle Componenten abrufen AWT, Swing, JavaFX & SWT 2
K Alle Events abfangen mit GlassPane AWT, Swing, JavaFX & SWT 7
T JTree - alle Nodes entfernen AWT, Swing, JavaFX & SWT 8
D JCheckBoxItem in Untermenüs alle gleichzeitig an- bzw. aus AWT, Swing, JavaFX & SWT 3
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
G Alle Werte einer Spalte in JTable zusammenrechnen AWT, Swing, JavaFX & SWT 2
G Alle Komponenten eines JPanels durchlaufen AWT, Swing, JavaFX & SWT 11
T Alle Folgefenster sollen im Hauptfenster geöffnet werden AWT, Swing, JavaFX & SWT 3
P Alle Komponenten von JPanel in der Mitte entfernen AWT, Swing, JavaFX & SWT 2
G Eine Schiftart für alle Komponenten festlegen AWT, Swing, JavaFX & SWT 6
G WindowListener für alle Fenster AWT, Swing, JavaFX & SWT 4
H <Synth> Alle die sich auskennen Bitte hier rein schaue AWT, Swing, JavaFX & SWT 2
Paule alle Elemente eines SWT Trees AWT, Swing, JavaFX & SWT 8
H JFileChooser für alle Dateien und Directories unterhalb AWT, Swing, JavaFX & SWT 7
C Beim Schließen eines fensters, schließen sich alle AWT, Swing, JavaFX & SWT 5
G Nicht alle Komponenten werden angezeigt AWT, Swing, JavaFX & SWT 8
S Alle EventListener einer JComponent abfragen? AWT, Swing, JavaFX & SWT 3
0 JList alle 20 Sekunden aktualisieren? AWT, Swing, JavaFX & SWT 8
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
M Listener für alle inneren Elemente gültig machen? AWT, Swing, JavaFX & SWT 5
M JList zeigt nicht alle Elemente AWT, Swing, JavaFX & SWT 4
B Alle URLs aller offenen Browser. AWT, Swing, JavaFX & SWT 12
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
L Alle Inhalte in BorderLayout.CENTER löschen? AWT, Swing, JavaFX & SWT 2
N Alle Komponenten eines JPanel aktivieren/deaktivieren? AWT, Swing, JavaFX & SWT 5
J [SWT] alle Zellen in einem Tree einzeln selektieren AWT, Swing, JavaFX & SWT 2
T JTree alle nodes expanden AWT, Swing, JavaFX & SWT 4
G Double-Click f. alle Komps UNIX u. WIN verschieden ? AWT, Swing, JavaFX & SWT 5
P TableCellRender für ALLE Spalten AWT, Swing, JavaFX & SWT 10
G Alle Elemente eines JPanel herausfinden? AWT, Swing, JavaFX & SWT 3
Luma Alle Fenster verstecken und wieder sichtbar machen? AWT, Swing, JavaFX & SWT 6
D Alle Inhalte einer JTextArea in einem JScrollPane löschen AWT, Swing, JavaFX & SWT 2
P JTree: Alle Knoten geöffnet anzeigen AWT, Swing, JavaFX & SWT 2
P JTree: alle Elemente ausklappen AWT, Swing, JavaFX & SWT 3
bernd JTree: alle Laufwerke anzeigen AWT, Swing, JavaFX & SWT 3
B Alle jMenu und JMenuItem in einem Array AWT, Swing, JavaFX & SWT 4
R removeAll() beseitigt nicht alle Komponenten!? AWT, Swing, JavaFX & SWT 11
M JTabbedPane zeigt alle Panels übereinander an :( AWT, Swing, JavaFX & SWT 8
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
R JComponent malt seine Kinder nicht AWT, Swing, JavaFX & SWT 8
M effizient mehrere BufferedImage in eines schreiben AWT, Swing, JavaFX & SWT 6
O Swing Icon verschwindet beim Verschieben eines JLabels AWT, Swing, JavaFX & SWT 8
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben