# Dateisystem in einem JTree darstellen



## Math (9. Jul 2004)

hallo, ich habe hier ein schönes beispiel, wie man ein filesystem in einem jtree darstellt. leider wird bei den pfaden immer der komplette pad angegeben, also zum beispiel so:

c:\programm
|
|
|------c:\programme\subdir


statt

c:\programm
|
|
|------subdir



```
import javax.swing.*;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.EventListenerList;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.io.File;
import java.io.Serializable;



public class FileTreeModel

    implements TreeModel, Serializable, Cloneable
{
    protected EventListenerList listeners;


    private Map map;

    private File root;


    public FileTreeModel(File root)
    {
 if (!root.exists())
     throw new IllegalArgumentException(String.valueOf(root));

 this.root = root;

 this.listeners = new EventListenerList();

 this.map = new HashMap();
    }


    public Object getRoot()
    {
 return root;
    }

    public boolean isLeaf(Object node)
    {
 return !((File)node).isDirectory();
    }

    public int getChildCount(Object node)
    {
 List children = children(node);

 if (children == null)
     return 0;

 return children.size();
    }

    public Object getChild(Object parent, int index)
    {
 return children(parent).get(index);
    }

    public int getIndexOfChild(Object parent, Object child)
    {
 return children(parent).indexOf(child);
    }


    public void valueForPathChanged(TreePath path, Object value)
    {
    }


    protected List children(Object node)
    {
 File f = (File)node;

 if (!f.isDirectory())
     return null;

 List children = (List)map.get(f);

 if (children == null)
 {
     File[] c = f.listFiles();

     if (c == null)
  return null;

     children = new ArrayList(c.length);

     for (int len = c.length, i = 0; i < len; i++)
  children.add(c[i]);

     map.put(f, children);
 }

 return children;
    }


    public Object clone()
    {
 try
 {
     FileTreeModel clone = (FileTreeModel)super.clone();
     
     clone.listeners = new EventListenerList();
     
     return clone;
 }
 catch (CloneNotSupportedException e)
 {
     throw new InternalError();
 }
    }

    public void addTreeModelListener(TreeModelListener l)
    {
 listeners.add(TreeModelListener.class, l);
    }

    public void removeTreeModelListener(TreeModelListener l)
    {
 listeners.remove(TreeModelListener.class, l);
    }



    public static void main(String[] args)
    {
 if (args.length != 1)
 {
     System.err.println("Usage: java FileTreeModel path");
     System.exit(1);
 }

 File root = new File(args[0]);

 if (!root.exists())
 {
     System.err.println(root+ ": No such file or directory");
     System.exit(2);
 }

 JTree t = new JTree(new FileTreeModel(root));

 JFrame f = new JFrame(root.toString());

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 f.getContentPane().add(new JScrollPane(t));
 
 f.pack();
 f.setVisible(true);
    }
}
```


hat jemand ne idee, wie man das ändern kann?
DANKE 

ps: code lässt sich kompilieren, als startparameter einen pfad angeben!!

_Editiert von P3AC3MAK3R: Tags repariert_


----------



## Beni (9. Jul 2004)

In einem der anderen Threads über dieses Problem, gibt es folgende Lösung:

```
public class Renderer extends DefaultTreeCellRenderer{
    private FileSystemView system; // die brauchen wir für die Icons

    public Renderer(){
      // Der Konstruktor
      system = FileSystemView.getFileSystemView();
    }

    public Component getTreeCellRendererComponent(JTree tree, Object value,
        boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){

      super.getTreeCellRendererComponent( tree, "", selected, expanded, leaf, row, hasFocus );

      File file = (File)value

      // Diese beiden Zeilen funktionieren nur, wenn die Datei offiziel existiert. !!!
      setIcon( system.getSystemIcon( file ));
      setText( system.getSystemDisplayName( file ));

      return this;
    }
  }
}
```

Dieser Renderer wird dem JTree übergeben. Aber er kann nur Dateien anzeigen, welche existieren "file.exists, file.canRead, etc...".


----------



## Math55 (9. Jul 2004)

hallo, und wie nutze ich das jetzt?

gruß


----------



## Beni (9. Jul 2004)

> Dieser Renderer wird dem JTree übergeben




```
JTree tree = ...
tree.setCellRenderer( new Renderer() );
```

 :wink:


----------



## p@anther (5. Aug 2004)

Also bei mir geht das nicht!? Was muss ich den da alles importieren und wo füge ich den code ein?


----------

