# Alle Kinder eines JTree bekommen



## tingel (24. Aug 2005)

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:


```
...
        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);
        ...
```


```
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 (24. Aug 2005)

Sowas:


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


----------



## tinge (24. Aug 2005)

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


----------



## meez (24. Aug 2005)

Funzt mit allem, was das TreeNode IF implementiert hat....


----------



## tingel (24. Aug 2005)

Wenn ich jetzt getRecursiveNodes(DefaultMutableTreeNode node) mit meinem TreeModel aufrufe, bekomme ich beim kompilieren die Fehlermeldung:

```
"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 (24. Aug 2005)

hmm? ()  :bahnhof: 

Die Liste musst du auch mitgeben:


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


----------



## tingel (24. Aug 2005)

Das mit der List hilft nicht.


```
...
    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]


----------



## meez (24. Aug 2005)

?? Da gehört doch ein Node hin, und kein Model...


----------



## tingel (25. Aug 2005)

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


----------



## Beni (25. Aug 2005)

Also sowas funktioniert bei mir um mal die erste Ebene auszugeben:

```
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 (25. Aug 2005)

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 (25. Aug 2005)

Danke für eure Hilfe.
Ich habe das jetzt folgendermaßen gelöst:

```
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:

```
...
TreePath treePath = rootSelectionTree.getSelectionPath();
DLP_GetRekursiveNodes grn = new DLP_GetRekursiveNodes();
grn.getChilds(model,treePath);
...
```


----------

