# Tree nur mit Ordner anzeigen?



## Jason (12. Okt 2004)

:?: 

Ich habe einen Tree erstellt und will aber der er nur Ordner anzeigt und keine Dateien.
Wie mache ich das?
Hier mein Tree Model:

```
class FileTreeModel implements TreeModel {

		protected myFile root; // Wurzel

		public void erneuerTree(){}
	
		public FileTreeModel(myFile root) {
			this.root = root;
		}

		public void setroot(myFile pathnamer) {
			this.root = pathnamer;
		}

		public Object getRoot() { // Liefert die Wurzel des Funktionsbaumes
			return root;
		} 
	
		public boolean isLeaf(Object node) { // ist es ein Blatt oder nicht
			return ( (myFile) node).isFile();
		} 
	
		public int getChildCount(Object parent) { //bekommt object Eltern und soll Anzahl Kind-Knoten dieses Knotens liefern
			String[] children = ( (myFile) parent).list(); //gibt String Liste von parent
			if (children == null)return 0; //wenn keine children dann 0
			return children.length; // sonst Länge der Kinder zurückgeben
		}

		public Object getChild(Object parent, int index) { // bekommt parent und Index des gesuchten Kind-Knotens und liefert Object Kind-Knoten
			String[] children = ( (myFile) parent).list(); //gibt String Liste von parent
			if ( (children == null) || (index >= children.length))return null;
			return new myFile( (myFile) parent, children[index]);
		}

		public int getIndexOfChild(Object parent, Object child) { //bekommt parent und object Kind
			String[] children = ( (myFile) parent).list();
			if (children == null)return -1; //wenn kinder 0 dann ende -1
	  		String childname = ( (myFile) child).getName(); //String name des Kindes ist

			for (int i = 0; i > children.length; i++) {
				if (childname.equals(children[i]))return i;
			}
			return -1;
		}

		public void valueForPathChanged(TreePath path, Object newvalue) {} // Wird aufgerufen, wenn der Wert für den Pfad geändert wurde.

		public void addTreeModelListener(TreeModelListener l) {
			listeners.add(l);
		} 
		
		
		public void removeTreeModelListener(TreeModelListener l) {} // Entfernt den Listener        

	}
```


----------



## abollm (12. Okt 2004)

Schau dir 'mal folgenden Code an, vielleicht hilft er dir ja:

```
import java.awt.*;
//import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.util.*;

public class FileTreeModel extends JFrame {
	Vector nodes = new Vector();

	DefaultMutableTreeNode root = new DefaultMutableTreeNode("Wurzelknoten");

	DefaultTreeModel dtm = new DefaultTreeModel(root);

	JTree jt = new JTree(dtm);

	JCheckBox jcb = new JCheckBox("Erweiterung möglich");

	Random r = new Random();

	int nodeCount = 0;

	public FileTreeModel() {
		super("Strukturbaumtest");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container content = getContentPane();
		addNode(root, 0);
		content.add(jcb, BorderLayout.NORTH);
		content.add(new JScrollPane(jt), BorderLayout.CENTER);
		jt.addTreeWillExpandListener(new TreeWillExpandListener() {
			public void treeWillCollapse(TreeExpansionEvent tse) {
			}

			public void treeWillExpand(TreeExpansionEvent tse)
					throws ExpandVetoException {
				if (jcb.isSelected())
					return;
				TreeNode tn = (TreeNode) tse.getPath().getLastPathComponent();
				Enumeration e = tn.children();
				boolean expand = false;
				while (!expand && e.hasMoreElements()) {
					if (((TreeNode) e.nextElement()).getChildCount() != 0)
						expand = false;
				}
				if (!expand)
					throw new ExpandVetoException(tse);
			}
		});
		setSize(400, 400);
	}

	private void addNode(DefaultMutableTreeNode parent, int level) {
		int cnt = r.nextInt(4) + 4 - level;
		for (int i = 0; i < cnt; i++) {
			DefaultMutableTreeNode node = new DefaultMutableTreeNode("Knoten "
					+ nodeCount++);
			parent.add(node);
			nodes.add(node);
			addNode(node, level + 1);
		}
	}

	public static void main(String[] args) {
		new FileTreeModel().setVisible(true);
	}
}
```


----------



## Jason (14. Okt 2004)

Hmm naja nicht so richtig.

Könnt ich nicht eine Selektion im Model machen so das nur Ordner ausgewählt werden?


----------



## Roar (14. Okt 2004)

ich ha bden code uzwar nicht gelesen, aber irgendwo wirst du ja die dateien aus den directories laden. und wenn du dann dein array von Files hast geh das array durch und überprüfe mit File#isDirectory() ob das n ordner is. wenn ja _> in JTree wenn nein > nix


----------



## tingel (7. Sep 2005)

Ich glaube zwar nicht, dass die Frage noch aktuell ist, aber falls jemand nochmal so eine Lösung hier sucht, schreibe ich mal Anlenung an den Code und der Bemerkung von Roar meine Lösung:

```
public Object getChild(Object parent, int index) { // bekommt parent und Index des gesuchten Kind-Knotens und liefert Object Kind-Knoten 
         String[] children = ( (myFile) parent).list(
         new FilenameFilter() {
            public boolean accept(File f, String s){
                File check;
                if(f.toLowerCase().endsWith(System.getProperty(file.separator)))
                    check = new File(f+s);
                else
                    check = new File(f+"\\"+s);
                if(check.isDirectory())
                    return true;
                return false;
            }
         }); //gibt String Liste von parent 
         if ( (children == null) || (index >= children.length))return null; 
         return new myFile( (myFile) parent, children[index]); 
      }
```
Dieser Code muss bei allen _list()_ im TreeModel eingetragen werden. Dann hat man einen Tree nur mit Ordnern


----------

