JTree vollständigen pfad anzeigen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hallo ich hab ein JTree gemacht.

wobei

wenn ich auf c: klicke diese schleife kommt:

Code:
  for(int childIndex=1; childIndex<daten.length; childIndex++) {
    child = new DefaultMutableTreeNode(daten[childIndex].toString());
    if(daten[childIndex].isFile() ==false)  {
    root.add(child);
    File[] datenzwei = daten[childIndex].listFiles();

das blöde ist, ich weiß ja nie wie wiet es reichen kann.
z.b ob es einen ordner C:\ programme\eins\zwei\drei\vier\fünf\sechs gibt.
mit einer for schleife müsste ich 7 schleifen machen und man weiß ja nie ob das dann komplett ist.

der punkt ist wie kann ich einen JTree machen mit dem ich absolut jeden ordner sehen kann, egal wie tief er verzweigt ist ?
 
als da wuerde ich auf ne loesung ausm netz zugreifen. das ist doch relativ kompliziert...hab das auch mal so gemacht. das hier scjeint ganz gut zu sein.

gruesse
 
hmm thx erstma aber, ich will auch wissen wie es funktioniert, aber bei diesem code sind nichtmal kommentare.

aber das ist wenigstens der erste funktionierende code ausm i net
thx!
 
ich fuer meinen teil habs aufgegeben immer alles kapieren zu wollen 😎 . aber man sollte schon in der lage sein, sowas zu erweitern.

gruesse
 
also ich hab jetzt einen ansatz undzwar, wenn eine node expanded wird sollen alle unternodes angezeigt werden.

könnt ihr mir den code geben? ^^
 
hi, wo ist da der ansatz, wenn wir dir den code geben? mal ganz davon abgesehen, dass ich keinen hier hab 🙂. also du musst halt mit einem expansionlistener lauschen, wenn ein knoten aufgemacht wird. dann den pfad holen, der ja sicher ein dir ist und dann rekursiv alle elemente dieses directories holen. dann eben wieder alles darstellen...

gruesse
 
jo hab ich aber der TreePath als String sieht so aus:

[root, C:\] (root ist nurn name)

und ich will diese ausgabe ja als File speichern. und ein File mit
[root, C:\] gibts ja nicht (jedenfalls bei mir 😉 .

also wie kann ich das in eine für File gültigen String machen?

bsp. : [root,c:\] wird zu c:\
 
hi, na eine methode schreiben, oder eine parserklasse, die dir das als pfad zurueckgibt. also [] abschneiden, dann ab , splitten und andersrum zusammensetzen und gegebenfalls das root weglassen.

gruesse
 
also hier ist nochmal mein sog. Ansatz


Code:
 public void treeExpanded(TreeExpansionEvent event) {
  	
  	TreePath path = event.getPath();
  	currentSelectionField.setText(path.toString());
  	DefaultMutableTreeNode TreeNode;
  	File datei = new File(path.toString());
  	if( datei.isFile() == false) {
  	File[] node = datei.listFiles();
  	
  	for( int i = 1; i < node.length; i++) {
  		TreeNode = new DefaultMutableTreeNode(node[i].toString());
  		root.add(TreeNode);
  		
  		
  		
  		
  	}
  }

wenn irgendwo erweitert wird, wird erstmal der pfad herausgefunden.
der pfad wird in File "konvertiert" und die darunterleigenden files werden aufgelistet.
die aufgelistet files werden dann dem baum geaddet.

fas problem jetzt:

1. der path ist wie ober beschrieben... schlecht.
2. ich weiß nicht wohin ich die files adden soll, deshalb hab ich zur not root genommen.
3. es klappt alles nicht

HILFE!!!
 
hi, warum nimmst du nicht das beispiel von oben? da ists doch alles prima? hier mal der code mit richtigen pfaden. unter linux gehts...uner win hab ichs nicht getestet...ist jetzt eher so schnell zusammengebaut, aber es geht🙂. bau dir am besten noch ne extra methode bzw. klase dafuer.

Code:
/*
 * FileTreeFrame.java
 *
 * Created on 6 October 2006, 10:57
 *
 */

package javastuff;

/**
 *
 * @author Andreas Golchert
 */
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

public class FileTreeFrame extends JFrame {
    private JTree fileTree;
    
    private FileSystemModel fileSystemModel;
    
    private JTextArea fileDetailsTextArea = new JTextArea();
    
    public FileTreeFrame(String directory) {
        super("JTree FileSystem Viewer");
        fileDetailsTextArea.setEditable(false);
        fileSystemModel = new FileSystemModel(new File(directory));
        fileTree = new JTree(fileSystemModel);
        fileTree.setEditable(true);
        fileTree.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent event) {
                File file = (File) fileTree.getLastSelectedPathComponent();
                fileDetailsTextArea.setText(getFileDetails(file));
            }
        });
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(
                fileTree), new JScrollPane(fileDetailsTextArea));
        getContentPane().add(splitPane);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(640, 480);
        setVisible(true);
        
        fileTree.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent evt) {
                // Get all nodes whose selection status has changed
                TreePath path = evt.getPath();
                
                String s = path.toString();
                System.out.println("path: " + s);
                
                String[] sa=s.split(",");
                
                ArrayList<String> list = new ArrayList<String>();
                
                String fs = System.getProperty("file.separator");
                
                String realPath="";
                
                for(String elem:sa){
                    elem=elem.trim();
                    elem=elem.replaceAll("\\[", "");
                    elem=elem.replaceAll("\\]", "");
                    System.out.println("pfadelement:" + elem);
                    list.add(elem);
                }
                
                
                for(int i=0; i<list.size();i++){
                    realPath+=fs+list.get(i);
                }
                realPath=realPath.replaceAll(fs+"+", fs);
                System.out.println("der pfad: " + realPath);
                
            }
        });
    }
    
    private String getFileDetails(File file) {
        if (file == null)
            return "";
        StringBuffer buffer = new StringBuffer();
        buffer.append("Name: " + file.getName() + "\n");
        buffer.append("Path: " + file.getPath() + "\n");
        buffer.append("Size: " + file.length() + "\n");
        return buffer.toString();
    }
    
    public static void main(String args[]) {
        new FileTreeFrame("/");
    }
}

class FileSystemModel implements TreeModel {
    private File root;
    
    private Vector listeners = new Vector();
    
    public FileSystemModel(File rootDirectory) {
        root = rootDirectory;
    }
    
    public Object getRoot() {
        return root;
    }
    
    public Object getChild(Object parent, int index) {
        File directory = (File) parent;
        String[] children = directory.list();
        return new TreeFile(directory, children[index]);
    }
    
    public int getChildCount(Object parent) {
        File file = (File) parent;
        if (file.isDirectory()) {
            String[] fileList = file.list();
            if (fileList != null)
                return file.list().length;
        }
        return 0;
    }
    
    public boolean isLeaf(Object node) {
        File file = (File) node;
        return file.isFile();
    }
    
    public int getIndexOfChild(Object parent, Object child) {
        File directory = (File) parent;
        File file = (File) child;
        String[] children = directory.list();
        for (int i = 0; i < children.length; i++) {
            if (file.getName().equals(children[i])) {
                return i;
            }
        }
        return -1;
        
    }
    
    public void valueForPathChanged(TreePath path, Object value) {
        File oldFile = (File) path.getLastPathComponent();
        String fileParentPath = oldFile.getParent();
        String newFileName = (String) value;
        File targetFile = new File(fileParentPath, newFileName);
        oldFile.renameTo(targetFile);
        File parent = new File(fileParentPath);
        int[] changedChildrenIndices = { getIndexOfChild(parent, targetFile) };
        Object[] changedChildren = { targetFile };
        fireTreeNodesChanged(path.getParentPath(), changedChildrenIndices, changedChildren);
        
    }
    
    private void fireTreeNodesChanged(TreePath parentPath, int[] indices, Object[] children) {
        TreeModelEvent event = new TreeModelEvent(this, parentPath, indices, children);
        Iterator iterator = listeners.iterator();
        TreeModelListener listener = null;
        while (iterator.hasNext()) {
            listener = (TreeModelListener) iterator.next();
            listener.treeNodesChanged(event);
        }
    }
    
    public void addTreeModelListener(TreeModelListener listener) {
        listeners.add(listener);
    }
    
    public void removeTreeModelListener(TreeModelListener listener) {
        listeners.remove(listener);
    }
    
    private class TreeFile extends File {
        public TreeFile(File parent, String child) {
            super(parent, child);
        }
        
        public String toString() {
            return getName();
        }
    }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben