2016-04-22 3 views
1

Ich wollte einen Baum aus einem vorhandenen Verzeichnis erstellen, so dass alle darin enthaltenen Unterordner und Dateien angezeigt werden. Ich habe es mit diesem Code:Java JTree aus dem Verzeichnis (zeigt den vollständigen Pfad und nicht nur den Namen der Datei an)

File file = new File(path); TreeModel model = new FileTreeModel(file); JTree tree = new JTree(model);

Aber jetzt zeigt es den vollständigen Pfad, anstatt nur die Ordner/Dateinamen. Wenn Sie nicht wissen, was ich meine, könnte dies helfen: java tree Bitte helfen ... Ich wollte die Lösung online finden, aber ich wusste nicht, wie Sie das Problem beschreiben. :/

+0

Anstatt 'File' direkt zu verwenden, schreiben Sie Ihre eigene Klasse, die Datei umschließt, und implementieren Sie dann seine' toString() 'Methode. – JayC667

+0

@ JayC667 Danke für den Rat, aber ich weiß nicht, wie ich das machen soll ...:/Könntest du bitte, wenn du Zeit hast, mir den Code für diese Klasse schicken? :) – 2xxx2

Antwort

1
import java.io.File; 
import java.util.ArrayList; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.WindowConstants; 
import javax.swing.event.TreeModelEvent; 
import javax.swing.event.TreeModelListener; 
import javax.swing.tree.TreeModel; 
import javax.swing.tree.TreeNode; 
import javax.swing.tree.TreePath; 

class FileTreeModel implements TreeModel { 
    private final ArrayList<TreeModelListener> mListeners = new ArrayList<>(); 
    private final MyFile      mFile; 

    public FileTreeModel(final MyFile pFile) { 
     mFile = pFile; 
    } 
    @Override public Object getRoot() { 
     return mFile; 
    } 
    @Override public Object getChild(final Object pParent, final int pIndex) { 
     return ((MyFile) pParent).listFiles()[pIndex]; 
    } 
    @Override public int getChildCount(final Object pParent) { 
     return ((MyFile) pParent).listFiles().length; 
    } 
    @Override public boolean isLeaf(final Object pNode) { 
     return !((MyFile) pNode).isDirectory(); 
    } 
    @Override public void valueForPathChanged(final TreePath pPath, final Object pNewValue) { 
     final MyFile oldTmp = (MyFile) pPath.getLastPathComponent(); 
     final File oldFile = oldTmp.getFile(); 
     final String newName = (String) pNewValue; 
     final File newFile = new File(oldFile.getParentFile(), newName); 
     oldFile.renameTo(newFile); 
     System.out.println("Renamed '" + oldFile + "' to '" + newFile + "'."); 
     reload(); 
    } 
    @Override public int getIndexOfChild(final Object pParent, final Object pChild) { 
     final MyFile[] files = ((MyFile) pParent).listFiles(); 
     for (int i = 0; i < files.length; i++) { 
      if (files[i] == pChild) return i; 
     } 
     return -1; 
    } 
    @Override public void addTreeModelListener(final TreeModelListener pL) { 
     mListeners.add(pL); 
    } 
    @Override public void removeTreeModelListener(final TreeModelListener pL) { 
     mListeners.remove(pL); 
    } 

    /** 
    * stolen from http://developer.classpath.org/doc/javax/swing/tree/DefaultTreeModel-source.html 
    * 
     * <p> 
     * Invoke this method if you've modified the TreeNodes upon which this model 
     * depends. The model will notify all of its listeners that the model has 
     * changed. It will fire the events, necessary to update the layout caches and 
     * repaint the tree. The tree will <i>not</i> be properly refreshed if you 
     * call the JTree.repaint instead. 
     * </p> 
     * <p> 
     * This method will refresh the information about whole tree from the root. If 
     * only part of the tree should be refreshed, it is more effective to call 
     * {@link #reload(TreeNode)}. 
     * </p> 
     */ 
    public void reload() { 
     // Need to duplicate the code because the root can formally be 
     // no an instance of the TreeNode. 
     final int n = getChildCount(getRoot()); 
     final int[] childIdx = new int[n]; 
     final Object[] children = new Object[n]; 

     for (int i = 0; i < n; i++) { 
      childIdx[i] = i; 
      children[i] = getChild(getRoot(), i); 
     } 

     fireTreeStructureChanged(this, new Object[] { getRoot() }, childIdx, children); 
    } 

    /** 
    * stolen from http://developer.classpath.org/doc/javax/swing/tree/DefaultTreeModel-source.html 
    * 
    * fireTreeStructureChanged 
    * 
    * @param source the node where the model has changed 
    * @param path the path to the root node 
    * @param childIndices the indices of the affected elements 
    * @param children the affected elements 
    */ 
    protected void fireTreeStructureChanged(final Object source, final Object[] path, final int[] childIndices, final Object[] children) { 
     final TreeModelEvent event = new TreeModelEvent(source, path, childIndices, children); 
     for (final TreeModelListener l : mListeners) { 
      l.treeStructureChanged(event); 
     } 
    } 
} 

class MyFile { 
    private final File mFile; 

    public MyFile(final File pFile) { 
     mFile = pFile; 
    } 

    public boolean isDirectory() { 
     return mFile.isDirectory(); 
    } 

    public MyFile[] listFiles() { 
     final File[] files = mFile.listFiles(); 
     if (files == null) return null; 
     if (files.length < 1) return new MyFile[0]; 

     final MyFile[] ret = new MyFile[files.length]; 
     for (int i = 0; i < ret.length; i++) { 
      final File f = files[i]; 
      ret[i] = new MyFile(f); 
     } 
     return ret; 
    } 

    public File getFile() { 
     return mFile; 
    } 

    @Override public String toString() { 
     return mFile.getName(); 
    } 
} 

public class FileWrapperDeluxe { 
    public static void main(final String[] args) { 
     final JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
     f.setBounds(100, 100, 400, 400); 

     final File file = new File("E:\\"); 
     final MyFile mf = new MyFile(file); 
     final TreeModel model = new FileTreeModel(mf); 

     final JTree tree = new JTree(model); 
     tree.setEditable(true); 

     f.add(new JScrollPane(tree)); 
     f.setVisible(true); 
    } 
} 
+0

Das ist es, danke! : D Jetzt nur noch eine Sache, kann ich meine eigenen Icons für die Ordner und Dateien im Baum haben? :) – 2xxx2

+1

https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html und http://stackoverflow.com/questions/20691946/set-icon-to-each-node-in-jtree – JayC667

+0

Danke Mann, du bist großartig. Du hast mir sehr geholfen .... Und du warst schnell. Danke :) – 2xxx2