JTree - Explorer mit nur eingeschränkter Anzeige

pabu1983

Mitglied
Hallo Zusammen,

ich bin jetzt schon seit Wochen dran mein eigenen Explorer für ein Progrämmchen zusammen zu klicken.
Ich habe auch eine Lösung die schon ganz gut passt. Nur fehlt eine wichtige Eigenschaft und ich hoffe das die Pro's hier im Forum mir helfen können um den nötigen Code hierfür zu ergänzen.

Also ich habe einen JTree der mir die Laufwerke und deren Ordner anzeigt. Nun will ich das auch die Dateien angezeigt werden. ABER - WICHTIG - nicht alle Dateien. Nur die, die mit den Endungen txt, jpg und png enden. Im Prinzip hätte ich gern den Windows-Explorer mit Dateiendungsfilter :)

Hier den JTree an dem ich schon seit Wochen das Problem versuche zu lösen...
Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author pabu
 */

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

public class DirTree extends JScrollPane {
    public static final ImageIcon ICON_COMPUTER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/monitor.png");
    public static final ImageIcon ICON_DISK = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/festplatte.png");
    public static final ImageIcon ICON_FOLDER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/ordner_zu.png");
    public static final ImageIcon ICON_EXPANDEDFOLDER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/ordner_auf.png");
    protected JTree m_tree;
    protected DefaultTreeModel m_model;

    public DirTree() {
        super();
        DefaultMutableTreeNode top = new DefaultMutableTreeNode(new IconData(ICON_COMPUTER, null, "Computer"));
        DefaultMutableTreeNode node;
        
        File[] roots = File.listRoots();                                        // START - Befüllung des Baumes
        for (int k=0; k<roots.length; k++) {                                    // Es werden alle Laufwerke
            node = new DefaultMutableTreeNode(new IconData(ICON_DISK,           // eingelesen die generell
                null, new FileNode(roots[k])));                                 // an diesem Rechner verfügbar
            top.add(node);                                                      // sind und in den Baum
            node.add(new DefaultMutableTreeNode(new Boolean(true)));            // eingefügt
        }                                                                       // ENDE - Befüllung des Baumes

        m_model = new DefaultTreeModel(top);
        m_tree = new JTree(m_model);
        m_tree.putClientProperty("JTree.lineStyle", "Angled");
        IconCellRenderer renderer = new IconCellRenderer();
        m_tree.setCellRenderer(renderer);
        m_tree.addTreeExpansionListener(new DirExpansionListener());
        m_tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        m_tree.setShowsRootHandles(true);
        m_tree.setEditable(false);

        this.getViewport().add(m_tree);
    }
    DefaultMutableTreeNode getTreeNode(TreePath path) {
        return (DefaultMutableTreeNode)(path.getLastPathComponent());
    }
    FileNode getFileNode(DefaultMutableTreeNode node) {
        if (node == null)
            return null;
        Object obj = node.getUserObject();
        if (obj instanceof IconData)
            obj = ((IconData)obj).getObject();
        if (obj instanceof FileNode)
            return (FileNode)obj;
        else
            return null;
    }
    // Make sure expansion is threaded and updating the tree model
    // only occurs within the event dispatching thread.
    class DirExpansionListener implements TreeExpansionListener {
        public void treeExpanded(TreeExpansionEvent event) {
            final DefaultMutableTreeNode node = getTreeNode(
                event.getPath());
            final FileNode fnode = getFileNode(node);
            Thread runner = new Thread() {
                public void run() {
                    if (fnode != null && fnode.expand(node)) {
                        Runnable runnable = new Runnable() {
                            public void run() {
                                m_model.reload(node);
                            }
                        };
                        SwingUtilities.invokeLater(runnable);
                    }
                }
            };
            runner.start();
        }
        public void treeCollapsed(TreeExpansionEvent event) {}
    }

    public static void main(String argv[]) {
        JFrame frame = new JFrame();
        DirTree scrollTree = new DirTree();
        frame.setSize(200,300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollTree);
        frame.setVisible(true);
    }
}

class IconCellRenderer extends DefaultTreeCellRenderer {
    public IconCellRenderer() {
        setLeafIcon(null);
        setOpenIcon(null);
    }
    public Component getTreeCellRendererComponent(JTree tree,
        Object value, boolean sel, boolean expanded, boolean leaf,
        int row, boolean hasFocus) {
        // Invoke default implementation
        Component result = super.getTreeCellRendererComponent(tree,
            value, sel, expanded, leaf, row, hasFocus);
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
        Object obj = node.getUserObject();
        setText(obj.toString());
        if (obj instanceof Boolean)
            setText("Retrieving data...");
        if (obj instanceof IconData) {
            IconData idata = (IconData)obj;
            if (expanded)
                setIcon(idata.getExpandedIcon());
            else
                setIcon(idata.getIcon());
        }
        else
            setIcon(null);
        return result;
    }
}

class IconData {
    protected Icon   m_icon;
    protected Icon   m_expandedIcon;
    protected Object m_data;
    public IconData(Icon icon, Object data) {
        m_icon = icon;
        m_expandedIcon = null;
        m_data = data;
    }
    public IconData(Icon icon, Icon expandedIcon, Object data) {
        m_icon = icon;
        m_expandedIcon = expandedIcon;
        m_data = data;
    }
    public Icon getIcon() {
        return m_icon;
    }
    public Icon getExpandedIcon() {
        return m_expandedIcon!=null ? m_expandedIcon : m_icon;
    }
    public Object getObject() {
        return m_data;
    }
    public String toString() {
        return m_data.toString();
    }
}
class FileNode {
    protected File m_file;
    public FileNode(File file) {
        m_file = file;
    }
    public File getFile() {
        return m_file;
    }
    public String toString() {
        return m_file.getName().length() > 0 ? m_file.getName() :
            m_file.getPath();
    }
    // Alternatively we copud sub-class TreeNode
    public boolean expand(DefaultMutableTreeNode parent) {
        DefaultMutableTreeNode flag = (DefaultMutableTreeNode)parent.getFirstChild();
        if (flag==null)   // No flag
            return false;
        Object obj = flag.getUserObject();
        if (!(obj instanceof Boolean))
            return false;      // Already expanded
        parent.removeAllChildren();  // Remove Flag
        File[] files = listFiles();
        if (files == null)
            return true;
        Vector v = new Vector();
        for (int k=0; k<files.length; k++) {
            File f = files[k];
            if (!(f.isDirectory()))
                continue;
            FileNode newNode = new FileNode(f);
            boolean isAdded = false;
            for (int i=0; i<v.size(); i++) {
                FileNode nd = (FileNode)v.elementAt(i);
                if (newNode.compareTo(nd) < 0) {
                    v.insertElementAt(newNode, i);
                    isAdded = true;
                    break;
                }
            }
            if (!isAdded)
                v.addElement(newNode);
        }
        for (int i=0; i<v.size(); i++) {
            FileNode nd = (FileNode)v.elementAt(i);
            IconData idata = new IconData(DirTree.ICON_FOLDER,
                DirTree.ICON_EXPANDEDFOLDER, nd);
            DefaultMutableTreeNode node = new
                DefaultMutableTreeNode(idata);
            parent.add(node);
            if (nd.hasSubDirs())
                node.add(new DefaultMutableTreeNode(
                    new Boolean(true) ));
        }
        return true;
    }
    public boolean hasSubDirs() {
        File[] files = listFiles();
        if (files == null)
            return false;
        for (int k=0; k<files.length; k++) {
            if (files[k].isDirectory())
                return true;
        }
        return false;
    }
    public int compareTo(FileNode toCompare) {
        return  m_file.getName().compareToIgnoreCase(
            toCompare.m_file.getName() );
    }
    protected File[] listFiles() {
        if (!m_file.isDirectory())
            return null;
        try {
            return m_file.listFiles();
        }
        catch (Exception ex) {
            return null;
        }
    }
}

mfg
pabu
 

SuperSeppel13

Bekanntes Mitglied
Der "listFiles"-Methode der Klasse File kannst du einen File(name)Filter übergeben. Schreib einfach einen Filter, der bloß die gewünschten Formate akzeptiert.
 

pabu1983

Mitglied
Hast du auch einen Codeschnipsel wie der File(name)Filter aussehen muss? Höre das zum ersten mal :) Muss mich mal über google einlesen...
 

SuperSeppel13

Bekanntes Mitglied
Ein Filter für txt-Dateien könnte eventuell so aussehen:

Java:
folder.listFiles(new FileFilter() {
    public boolean accept(File f) {
        if(f.isDirectory())
            return false;

        String name = f.getName();
        String extension = name.substring(name.lastIndexOf(".")+1);
        //System.out.println(name + "; " + extension);
        return extension.equals("txt");
    }
});
 

Arbon

Bekanntes Mitglied
Anstatt die Extension herauszufiltern sollte eigentlich auch das reichen:
Java:
folder.listFiles(new FileFilter() {
@Override
		public boolean accept(File f) {
		        if(f.isDirectory())
			       return false;
			return f.getAbsolutePath().endsWith(".txt");
		}
});
 

SuperSeppel13

Bekanntes Mitglied
Naja, der JFileChooser ist jetzt nicht so geeignet um ein TreeModel daraus zu basteln und ich hatte mir überlegt, die Dateiendung herauszufiltern um sie dann mit einer Liste zugelassener Endungen zu vergleichen. Wenn es eh bloß ein oder zwei formate sind, ist es mit endsWith(...) wohl einfacher.
 

pabu1983

Mitglied
Ja das mit dem FileChooser ist wirklich nicht so praktisch für meinen Fall.
Danke euch für eure Antworten, werde jetzt versuchen das in meinen Quelltext einzubauen.
Hoffentlich reichen hierfür meine Java-Kenntnisse (*gespannt bin*)

[EDIT]: Also ich hab jetzt mal alles so eingebaut und das Problem ist was sich jetzt ergibt das wenn ich auf die Laufwerke klicke, öffnet sich nichts (als ob die Laufwerke leer sind). Ich hab auch schon Dateien mit der entsprechenden Endung direkt ins laufwerk gelegt (z.B. direkt in C:\) hilft nix
 
Zuletzt bearbeitet:

SuperSeppel13

Bekanntes Mitglied
Naja, also wenn du den FileFilter genau so übernaommen hast, wie in unseren Beispielen, dann filtert der halt auch alle Ordner heraus. Warum allerdings auch dateien direkt im entsprechenden laufwerk nicht angezeigt werden, kann ich so auch nicht sagen.
Da müsstest du nochmal deinen code posten.
 

pabu1983

Mitglied
Ok also hier der Code mit der Version von euch. Wenn ich das so ausführe passiert das wie oben erwähnt und in den Bildern dargestellt wird.

Code:
import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

public class DirTree extends JScrollPane {
    public static final ImageIcon ICON_COMPUTER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/monitor.png");
    public static final ImageIcon ICON_DISK = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/festplatte.png");
    public static final ImageIcon ICON_FOLDER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/ordner_zu.png");
    public static final ImageIcon ICON_EXPANDEDFOLDER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/ordner_auf.png");
    protected JTree m_tree;
    protected DefaultTreeModel m_model;

    public DirTree() {
        super();
        DefaultMutableTreeNode top = new DefaultMutableTreeNode(new IconData(ICON_COMPUTER, null, "Computer"));
        DefaultMutableTreeNode node;
        
        File[] roots = File.listRoots();                                        // START - Befüllung des Baumes
        for (int k=0; k<roots.length; k++) {                                    // Es werden alle Laufwerke
            node = new DefaultMutableTreeNode(new IconData(ICON_DISK,           // eingelesen die generell
                null, new FileNode(roots[k])));                                 // an diesem Rechner verfügbar
            top.add(node);                                                      // sind und in den Baum
            node.add(new DefaultMutableTreeNode(new Boolean(true)));            // eingefügt
        }                                                                       // ENDE - Befüllung des Baumes

//        try {
//            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
//        }
//        catch (Exception e) {
//            e.printStackTrace();
//        }

        m_model = new DefaultTreeModel(top);
        m_tree = new JTree(m_model);
        m_tree.putClientProperty("JTree.lineStyle", "Angled");
        IconCellRenderer renderer = new IconCellRenderer();
        m_tree.setCellRenderer(renderer);
        m_tree.addTreeExpansionListener(new DirExpansionListener());
        m_tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        m_tree.setShowsRootHandles(true);
        m_tree.setEditable(false);

        this.getViewport().add(m_tree);
    }
    DefaultMutableTreeNode getTreeNode(TreePath path) {
        return (DefaultMutableTreeNode)(path.getLastPathComponent());
    }
    FileNode getFileNode(DefaultMutableTreeNode node) {
        if (node == null)
            return null;
        Object obj = node.getUserObject();
        if (obj instanceof IconData)
            obj = ((IconData)obj).getObject();
        if (obj instanceof FileNode)
            return (FileNode)obj;
        else
            return null;
    }
    // Make sure expansion is threaded and updating the tree model
    // only occurs within the event dispatching thread.
    class DirExpansionListener implements TreeExpansionListener {
        public void treeExpanded(TreeExpansionEvent event) {
            final DefaultMutableTreeNode node = getTreeNode(
                event.getPath());
            final FileNode fnode = getFileNode(node);
            Thread runner = new Thread() {
                public void run() {
                    if (fnode != null && fnode.expand(node)) {
                        Runnable runnable = new Runnable() {
                            public void run() {
                                m_model.reload(node);
                            }
                        };
                        SwingUtilities.invokeLater(runnable);
                    }
                }
            };
            runner.start();
        }
        public void treeCollapsed(TreeExpansionEvent event) {}
    }

    public static void main(String argv[]) {
        JFrame frame = new JFrame();
        DirTree scrollTree = new DirTree();
        frame.setSize(200,300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollTree);
        frame.setVisible(true);
    }
}

class IconCellRenderer extends DefaultTreeCellRenderer {
    public IconCellRenderer() {
        setLeafIcon(null);
        setOpenIcon(null);
    }
    public Component getTreeCellRendererComponent(JTree tree,
        Object value, boolean sel, boolean expanded, boolean leaf,
        int row, boolean hasFocus) {
        // Invoke default implementation
        Component result = super.getTreeCellRendererComponent(tree,
            value, sel, expanded, leaf, row, hasFocus);
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
        Object obj = node.getUserObject();
        setText(obj.toString());
        if (obj instanceof Boolean)
            setText("Retrieving data...");
        if (obj instanceof IconData) {
            IconData idata = (IconData)obj;
            if (expanded)
                setIcon(idata.getExpandedIcon());
            else
                setIcon(idata.getIcon());
        }
        else
            setIcon(null);
        return result;
    }
}

class IconData {
    protected Icon   m_icon;
    protected Icon   m_expandedIcon;
    protected Object m_data;
    public IconData(Icon icon, Object data) {
        m_icon = icon;
        m_expandedIcon = null;
        m_data = data;
    }
    public IconData(Icon icon, Icon expandedIcon, Object data) {
        m_icon = icon;
        m_expandedIcon = expandedIcon;
        m_data = data;
    }
    public Icon getIcon() {
        return m_icon;
    }
    public Icon getExpandedIcon() {
        return m_expandedIcon!=null ? m_expandedIcon : m_icon;
    }
    public Object getObject() {
        return m_data;
    }
    public String toString() {
        return m_data.toString();
    }
}

class FileNode {
    protected File m_file;
    public FileNode(File file) {
        m_file = file;
    }
    public File getFile() {
        return m_file;
    }
    public String toString() {
        return m_file.getName().length() > 0 ? m_file.getName() :
            m_file.getPath();
    }

    // Alternatively we copud sub-class TreeNode
    public boolean expand(DefaultMutableTreeNode parent) {
        DefaultMutableTreeNode flag = (DefaultMutableTreeNode)parent.getFirstChild();
        if (flag==null)   // No flag
            return false;
        Object obj = flag.getUserObject();
        if (!(obj instanceof Boolean))
            return false;      // Already expanded
        parent.removeAllChildren();  // Remove Flag
        File[] files = listFiles();
        if (files == null)
            return true;
        Vector v = new Vector();
        for (int k=0; k<files.length; k++) {
            File f = files[k];
            if (!(f.isDirectory()))
                continue;
            FileNode newNode = new FileNode(f);
            boolean isAdded = false;
            for (int i=0; i<v.size(); i++) {
                FileNode nd = (FileNode)v.elementAt(i);
                if (newNode.compareTo(nd) < 0) {
                    v.insertElementAt(newNode, i);
                    isAdded = true;
                    break;
                }
            }
            if (!isAdded)
                v.addElement(newNode);
        }
        for (int i=0; i<v.size(); i++) {
            FileNode nd = (FileNode)v.elementAt(i);
            IconData idata = new IconData(DirTree.ICON_FOLDER,
                DirTree.ICON_EXPANDEDFOLDER, nd);
            DefaultMutableTreeNode node = new
                DefaultMutableTreeNode(idata);
            parent.add(node);
            if (nd.hasSubDirs())
                node.add(new DefaultMutableTreeNode(
                    new Boolean(true) ));
        }
        return true;
    }
    public boolean hasSubDirs() {
        File[] files = listFiles();
        if (files == null)
            return false;
        for (int k=0; k<files.length; k++) {
            if (files[k].isDirectory())
                return true;
        }
        return false;
    }
    public int compareTo(FileNode toCompare) {
        return  m_file.getName().compareToIgnoreCase(
            toCompare.m_file.getName() );
    }

        protected File[] listFiles() {
        if (!m_file.isDirectory())
            return null;
        try {
            return m_file.listFiles(new FileFilter() {
                public boolean accept(File f) {
                    if(f.isDirectory())
                        return false;
                    String name = f.getName();
                    String extension = name.substring(name.lastIndexOf(".")+1);
                    //System.out.println(name + "; " + extension);
                    return extension.equals("txt");
                }
            });
        }
        catch (Exception ex) {
            return null;
        }
    }
}
 

SuperSeppel13

Bekanntes Mitglied
Also ich habe mir jetzt nich die mühe gemacht, deinen ganzen quelltext nachzuvollziehen, aber der FileFilter funktioniert hervorragend.
Wenn du willst, dass auch Ordner angezeigt werden, musst du natürlich, wenn das "File" ein ordner ist, true und nicht false wiedergeben. Aber selbst wenn du alle arten von dateien akzeptierst, werden in dem tree keine dateien angezeigt. Das liegt also an der art, wie du die daten verarbeitest.

Noch ein Hinweis: im moment erzeugst du noch bei jedem aufruf von listFiles() einen neuen FileFilter. Besser wäre es, in FileNode FileFilter zu implementieren:
Java:
class FileNode implements FileFilter{

    // all deine Felder und Methoden...    

    protected File[] listFiles() {
        if (!m_file.isDirectory()) {
            return null;
        }
        try {
            return m_file.listFiles(this);
        } catch (Exception ex) {
            return null;
        }
    }
    
    public boolean accept(File f) {
        if (f.isDirectory()) 
            return true;
        
        String name = f.getName();
        String extension = name.substring(name.lastIndexOf(".") + 1);
        System.out.println(name + " -> " + extension.toLowerCase().equals("jpg"));//um zu sehen, welche dateien akzeptiert werden
        return extension.toLowerCase().equals("jpg");
    }
}
 

pabu1983

Mitglied
So also ich hab jetzt meine Quellcode soweit das ich weiß wo was geändert werden muss, allerdings kenn ich die Befehle nicht. Erst mal mein aktueller Quellcode:

Code:
import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

public class DirTree extends JScrollPane {
    public static final ImageIcon ICON_COMPUTER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/monitor.png");
    public static final ImageIcon ICON_DISK = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/festplatte.png");
    public static final ImageIcon ICON_FOLDER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/ordner_zu.png");
    public static final ImageIcon ICON_EXPANDEDFOLDER = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/ordner_auf.png");
    public static final ImageIcon ICON_TXT = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/datei_txt.png");
    public static final ImageIcon ICON_JPG = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/datei_jpg.png");
    public static final ImageIcon ICON_PNG = new ImageIcon("D:/Projekte/2009-11/Java_GUI/Conti_Tree/Icons/datei_png.png");
    protected JTree m_tree;
    protected DefaultTreeModel m_model;

    public DirTree() {
        super();
        DefaultMutableTreeNode top = new DefaultMutableTreeNode(new IconData(ICON_COMPUTER, null, "Computer"));
        DefaultMutableTreeNode node;
        
        File[] roots = File.listRoots();                                        // START - Befüllung des Baumes
        for (int k=0; k<roots.length; k++) {                                    // Es werden alle Laufwerke
            node = new DefaultMutableTreeNode(new IconData(ICON_DISK,           // eingelesen die generell
                null, new FileNode(roots[k])));                                 // an diesem Rechner verfügbar
            top.add(node);                                                      // sind und in den Baum
            node.add(new DefaultMutableTreeNode(new Boolean(true)));            // eingefügt
        }                                                                       // ENDE - Befüllung des Baumes

//        try {
//            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
//        }
//        catch (Exception e) {
//            e.printStackTrace();
//        }

        m_model = new DefaultTreeModel(top);
        m_tree = new JTree(m_model);
        m_tree.putClientProperty("JTree.lineStyle", "Angled");
        IconCellRenderer renderer = new IconCellRenderer();
        m_tree.setCellRenderer(renderer);
        m_tree.addTreeExpansionListener(new DirExpansionListener());
        m_tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        m_tree.setShowsRootHandles(true);
        m_tree.setEditable(false);


        this.getViewport().add(m_tree);
    }
    DefaultMutableTreeNode getTreeNode(TreePath path) {
        return (DefaultMutableTreeNode)(path.getLastPathComponent());
    }
    FileNode getFileNode(DefaultMutableTreeNode node) {
        if (node == null)
            return null;
        Object obj = node.getUserObject();
        if (obj instanceof IconData)
            obj = ((IconData)obj).getObject();
        if (obj instanceof FileNode)
            return (FileNode)obj;
        else
            return null;
    }
    // Make sure expansion is threaded and updating the tree model
    // only occurs within the event dispatching thread.
    class DirExpansionListener implements TreeExpansionListener {
        public void treeExpanded(TreeExpansionEvent event) {
            final DefaultMutableTreeNode node = getTreeNode(
                event.getPath());
            final FileNode fnode = getFileNode(node);
            Thread runner = new Thread() {
                public void run() {
                    if (fnode != null && fnode.expand(node)) {
                        Runnable runnable = new Runnable() {
                            public void run() {
                                m_model.reload(node);
                            }
                        };
                        SwingUtilities.invokeLater(runnable);
                    }
                }
            };
            runner.start();
        }
        public void treeCollapsed(TreeExpansionEvent event) {}
    }

    public static void main(String argv[]) {
        JFrame frame = new JFrame();
        DirTree scrollTree = new DirTree();
        frame.setSize(200,300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollTree);
        frame.setVisible(true);
    }
}

class IconCellRenderer extends DefaultTreeCellRenderer {
    public IconCellRenderer() {
        setLeafIcon(null);
        setOpenIcon(null);
    }
    public Component getTreeCellRendererComponent(JTree tree,
        Object value, boolean sel, boolean expanded, boolean leaf,
        int row, boolean hasFocus) {
        // Invoke default implementation
        Component result = super.getTreeCellRendererComponent(tree,
            value, sel, expanded, leaf, row, hasFocus);
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
        Object obj = node.getUserObject();
        setText(obj.toString());
        if (obj instanceof Boolean)
            setText("Retrieving data...");
        if (obj instanceof IconData) {
            IconData idata = (IconData)obj;
            if (expanded)
                setIcon(idata.getExpandedIcon());
            else
                setIcon(idata.getIcon());
        }
        else
            setIcon(null);
        return result;
    }
}

class IconData {
    protected Icon   m_icon;
    protected Icon   m_expandedIcon;
    protected Object m_data;
    public IconData(Icon icon, Object data) {
        m_icon = icon;
        m_expandedIcon = null;
        m_data = data;
    }
    public IconData(Icon icon, Icon expandedIcon, Object data) {
        m_icon = icon;
        m_expandedIcon = expandedIcon;
        m_data = data;
    }
    public Icon getIcon() {
        return m_icon;
    }
    public Icon getExpandedIcon() {
        return m_expandedIcon!=null ? m_expandedIcon : m_icon;
    }
    public Object getObject() {
        return m_data;
    }
    public String toString() {
        return m_data.toString();
    }
}

class FileNode {
    protected File m_file;
    public FileNode(File file) {
        m_file = file;
    }
    public File getFile() {
        return m_file;
    }
    public String toString() {
        return m_file.getName().length() > 0 ? m_file.getName() :
            m_file.getPath();
    }

    // Alternatively we copud sub-class TreeNode
    public boolean expand(DefaultMutableTreeNode parent) {
        DefaultMutableTreeNode flag = (DefaultMutableTreeNode)parent.getFirstChild();
        if (flag==null)   // No flag
            return false;
        Object obj = flag.getUserObject();
        if (!(obj instanceof Boolean))
            return false;      // Already expanded
        parent.removeAllChildren();  // Remove Flag
        File[] files = listFiles();
        if (files == null)
            return true;
        Vector v = new Vector();
        for (int k=0; k<files.length; k++) {
            File f = files[k];
            
//            if (!(f.isDirectory()))       // NUR ORDNER ANZEIGEN!!!
  // HIER NOCH EINFÜGEN DAS ANDERE ICONS VERWENDET WERDEN!!!!!
//                continue;                 // NUR ORDNER ANZEIGEN!!!

            FileNode newNode = new FileNode(f);
            boolean isAdded = false;
            for (int i=0; i<v.size(); i++) {
                FileNode nd = (FileNode)v.elementAt(i);
                if (newNode.compareTo(nd) < 0) {
                    v.insertElementAt(newNode, i);
                    isAdded = true;
                    break;
                }
            }
            if (!isAdded)
                v.addElement(newNode);
        }
        for (int i=0; i<v.size(); i++) {
            FileNode nd = (FileNode)v.elementAt(i);
            IconData idata = new IconData(DirTree.ICON_FOLDER,
                DirTree.ICON_EXPANDEDFOLDER, nd);
            DefaultMutableTreeNode node = new
                DefaultMutableTreeNode(idata);
            parent.add(node);
            if (nd.hasSubDirs())
                node.add(new DefaultMutableTreeNode(
                    new Boolean(true) ));
        }
        return true;
    }
    public boolean hasSubDirs() {
        File[] files = listFiles();
        if (files == null)
            return false;
        for (int k=0; k<files.length; k++) {
            if (files[k].isDirectory())
                return true;
        }
        return false;
    }
    public int compareTo(FileNode toCompare) {
        return  m_file.getName().compareToIgnoreCase(
            toCompare.m_file.getName() );
    }
    
        protected File[] listFiles() {
        if (!m_file.isDirectory())
            return null;
        try {
            return m_file.listFiles(new FileFilter() {
                public boolean accept(File f) {
                    if(f.isDirectory())
                        // Durchsuche den Ordner auf txt/jpg/png
                        return true;
                    String name = f.getName();
                    String extension = name.substring(name.lastIndexOf(".")+1);
                    //System.out.println(name + "; " + extension);
                    return extension.equals("txt") || extension.equals("jpg") || extension.equals("png");
                }
            });
        }
        catch (Exception ex) {
            return null;
        }
    }

}

Jetzt will ich noch zwei Dinge ändern. Ich glaube das erste kann ich in der Expand-Methode ändern da wo ich folgendes stehen habe:
Code:
//            if (!(f.isDirectory()))       // NUR ORDNER ANZEIGEN!!!
  // HIER NOCH EINFÜGEN DAS ANDERE ICONS VERWENDET WERDEN!!!!!
//                continue;                 // NUR ORDNER ANZEIGEN!!!

Wie kann ich an dieser Stelle sagen das er für alle Dateien (also Blätter) die die Endung "txt" haben, dass am Beginn des Quellcodes definierte ImageIcon ICON_TXT nehmen soll? Und das auch für "jpg" und "png"?

Und das zweite werde ich wohl am schluss vom quelltext ändern müssen:
Code:
try {
            return m_file.listFiles(new FileFilter() {
                public boolean accept(File f) {
                    if(f.isDirectory())
                        // Durchsuche den Ordner auf txt/jpg/png
                        return true;
                    String name = f.getName();
                    String extension = name.substring(name.lastIndexOf(".")+1);
                    //System.out.println(name + "; " + extension);
                    return extension.equals("txt") || extension.equals("jpg") || extension.equals("png");
                }
            });
        }

Und zwar will ich das er auch in Unterordner nach diesen Dateiendungen sucht und wenn eine dieser vorhanden ist ein true ansonsten ein false zurückliefert. Soll auch mit Unter-Unter-Unterordner möglich sein (usw.)

Danke für eure Hilfe, ich versuch natürlich nebenbei das auch selbst hinzubekommen...
 

SuperSeppel13

Bekanntes Mitglied
Nimms mir nicht übel, dass ich jetzt keine Zeit habe, konkrete implementierungen zu basteln, aber hier ein paar anregungen:

Erweitere FileNode dahingehend, dass jedes Objekt der Klasse den Typ des Files (Ordner/txt/png/...) enthält und erzeuge dann für jede der entsprechenden Dateien einen neuen FileNode, wie du es auch schon mit den Ordnern tust.
Dann musst du nurnoch deinen TreeCellRenderer ändern, sodass er zu jedem typ das entsprechende Icon zeichnet.

Wenn du willst, dass dein FileFilter nur alle die Ordner durchlässt, die (in irgendeinem unterordner) eine txt beinhalten, müsstest du beim aufklappen einer Festplatte erstmal die GESAMTE platte durchsuchen. Das dauert!!! Ich glaube nicht, dass du das wirklich willst...
Da ist es (glaube ich) besser, alle ordner anzuzeigen, auch wenn man dann womöglich nach dem aufklappen eines ordners feststellen muss, dass er keine txts enthält.
 

pabu1983

Mitglied
ja ne versteh ich seppel, ich will es ja auch selbst hinbekommen. Danke für deine Tips, werd mich mal versuchen das hinzubekommen...aber wenn du mal die Muse haben solltest, kannste gern etwas Quelltext zusammenhäääcken ;)
 

pabu1983

Mitglied
Also das mit den Icons hab ich so versucht
Code:
    public IconCellRenderer(File dat) {
        String name = dat.getName();
        String extension = name.substring(name.lastIndexOf(".")+1);
        if (extension.equals("aus"))
            setLeafIcon(DirTree.ICON_AUS);
        if (extension.equals("dl2"))
            setLeafIcon(DirTree.ICON_DL2);
        if (extension.equals("dl3"))
            setLeafIcon(DirTree.ICON_DL3);
        setOpenIcon(null);
    }

Aber dann kommt im Netbeans ein Fehler oben im public DirTree() bei:
Code:
IconCellRenderer renderer = new IconCellRenderer();

Cannot find symbol constructor IconCellRenderer. Das liegt ja daran das ich ja File übergeben muss, aber ich weiß nicht welches :)
Ich glaub so langsam ich programmier in die falsche Richtung :(
 

SuperSeppel13

Bekanntes Mitglied
Hm, da gehst du wirklich etwas in die falsche richtung...
Du kannst natürlich deinem IconCellRenderer im Konstruktor nicht das Icon für jeden TreeNode übergeben.
Eigentlich kann dein IconCellRenderer schon alles, du musst bloß das richtige Icon in dem IconData-Objekt übergeben.
Ich habe dir hier nochmal was gebastelt:
- In "FileNode.expand(...)", wo vorher mit Dateien nichts gemacht wurde, wird hier eine zweite Liste (Vector) für diese angelegt [kleiner Tipp: mit "Vector<FileNode>" kannst du direkt angeben, dass der Vector nur FileNodes enthält - erspart das TypeCasting].
- Die beiden Listen werden dann nacheinander (erst ordner, dann dateien) dem parent node hinzugefügt.
- ich habe deine hasSubDirs-Methode geändert, sodass auch FileNodes von Ordnern, die zwar keine Unterprdner, allerdings weitere relevante Dateien enthalten, das flag erhalten und somit expandable werden.

hier der code:
Java:
    public boolean expand(DefaultMutableTreeNode parent) {
        // flag checking...
        DefaultMutableTreeNode flag = (DefaultMutableTreeNode) parent.getFirstChild();
        if (flag == null) // No flag
        {
            return false;
        }
        Object obj = flag.getUserObject();
        if (!(obj instanceof Boolean)) {
            return false;      // Already expanded
        }
        parent.removeAllChildren();  // Remove Flag
        File[] files = listFiles();
        if (files == null) {
            return true;
        }

        // Datei- unf Ordnerlisten erstellen
        Vector<FileNode> dirs = new Vector<FileNode>();//liste der Ordner
        Vector<FileNode> leafs = new Vector<FileNode>();//Liste der Dateien
        Vector<FileNode> v;
        for (int k = 0; k < files.length; k++) {
            File f = files[k];
            if (f.isDirectory()){
                v = dirs;
            } else {
                v = leafs;
            }

            FileNode newNode = new FileNode(f);
            boolean isAdded = false;
            for (int i = 0; i < v.size(); i++) {
                if (newNode.compareTo(v.elementAt(i)) < 0) {
                    v.insertElementAt(newNode, i);
                    isAdded = true;
                    break;
                }
            }
            if (!isAdded) {
                v.addElement(newNode);
            }
        }

        // alle ordner hinzufügen
        for (int i = 0; i < dirs.size(); i++) {
            FileNode nd = (FileNode) dirs.elementAt(i);
            IconData idata = new IconData(DirTree.ICON_FOLDER,
                    DirTree.ICON_EXPANDEDFOLDER, nd);
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(idata);
            parent.add(node);

            if (!nd.isLeaf()) {
                node.add(new DefaultMutableTreeNode(
                        new Boolean(true)));
            }
        }

        // alle dateien hinzufügen
        for (int i = 0; i < leafs.size(); i++) {
            FileNode nd = leafs.elementAt(i);
            // hier evtl dateityp von "nd.m_file" überprüfen und dann
            IconData idata = new IconData(DirTree.ICON_TXT, // hier das entsprechende Icon übergeben
                    DirTree.ICON_EXPANDEDFOLDER, nd);
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(idata);
            parent.add(node);
        }
        return true;
    }

    public boolean isLeaf() { // ehemals "hasSubDirs"
        File[] files = listFiles();
        return files == null || files.length == 0;
    }

Ich hoffe, das hilft dir weiter.
Viel Erfolg damit!
 

pabu1983

Mitglied
Hey super seppel!!! DANKE!!! Das funktioniet echt super! Jetzt versuch ich mal ob ich das allein hinbekomme mit den drei verschiedenen Endungen = verschiedene Icons...

JUHU!! Geschafft!!! NOCHMALS DANKE AN ALLE!!!!!!!!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrittenFritze JTree, LazyLoading und "Rückwärtstraversion" AWT, Swing, JavaFX & SWT 3
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
W Swing Anzeigefehler bei JTree AWT, Swing, JavaFX & SWT 1
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
H Swing JTree: Zählt der rootNode mit? AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
R JTree behandeln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
T JTree mit Symbolen? AWT, Swing, JavaFX & SWT 8
R Anfängerfrage: Ansichten des JTree AWT, Swing, JavaFX & SWT 1
H Swing JTree Minimumgröße AWT, Swing, JavaFX & SWT 2
F Swing JTree + DiffUtils // Markierung Nodes aufheben AWT, Swing, JavaFX & SWT 2
I JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Swing JTree AWT, Swing, JavaFX & SWT 4
M Nodes in JTree nicht anzeigen AWT, Swing, JavaFX & SWT 0
T JTree mit Cloud verbinden AWT, Swing, JavaFX & SWT 0
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
S Swing JTree verwirrt mich AWT, Swing, JavaFX & SWT 2
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
J JTree speichern AWT, Swing, JavaFX & SWT 4
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
B JTree mit Ordneransicht in JPanel einbinden AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
V Swing JTree - Umbenennen selbst handlen. AWT, Swing, JavaFX & SWT 2
E Übergebenem JTree Blätter hinzufügen AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
A Swing JTree - Nodes expanden AWT, Swing, JavaFX & SWT 2
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
B JTree AWT, Swing, JavaFX & SWT 9
T Menüacceleratoren verschwinden bei JTree AWT, Swing, JavaFX & SWT 5
1 Swing JTree collapse child nodes AWT, Swing, JavaFX & SWT 4
B JTree - sehr individuell AWT, Swing, JavaFX & SWT 3
G Swing JTree - Verbindungslinien entfernen AWT, Swing, JavaFX & SWT 4
A Swing Herausfinden ob bei JTree Klick auf "+"/"-" anahnd x,y AWT, Swing, JavaFX & SWT 2
S Swing JTree und seine Listener... AWT, Swing, JavaFX & SWT 4
L Swing JTree wird nicht selektiert AWT, Swing, JavaFX & SWT 2
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
A JTree aus Pfaden erzeugen AWT, Swing, JavaFX & SWT 3
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
X Datensätze in JTree AWT, Swing, JavaFX & SWT 2
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
E JTree Auswahl AWT, Swing, JavaFX & SWT 2
K JTree width der Treenodes auf 100% AWT, Swing, JavaFX & SWT 6
C JTree LastSelectedPathComponent benutzen? AWT, Swing, JavaFX & SWT 3
S Swing JTree Node Text nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
Landei Swing JTree mit "Tabellenzeilen"? AWT, Swing, JavaFX & SWT 5
Rudolf Swing JTree Node anhand vom Namen finden AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
Z JTree rootChilds AWT, Swing, JavaFX & SWT 2
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
E Swing JTree AWT, Swing, JavaFX & SWT 2
J Swing Lazy Loading in JTree wenn gescrollt wird AWT, Swing, JavaFX & SWT 3
N Knotenanordnung in JTree AWT, Swing, JavaFX & SWT 4
S JTree mit Liste zur Speicherung AWT, Swing, JavaFX & SWT 3
S Jtree CheckNode mit JPanel AWT, Swing, JavaFX & SWT 32
G JTree entfernt Nodes nicht AWT, Swing, JavaFX & SWT 12
C Swing JTree und TreeModel AWT, Swing, JavaFX & SWT 15
S Swing JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
J JTree AWT, Swing, JavaFX & SWT 2
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
E Swing JTree setSelectedPath funktioniert nicht?! AWT, Swing, JavaFX & SWT 5
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
S JTree aus List<File> erstellen AWT, Swing, JavaFX & SWT 8
C Swing MouseEntered(?) für jeden Node im JTree AWT, Swing, JavaFX & SWT 4
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
C Swing JTree UI Probleme AWT, Swing, JavaFX & SWT 6
G JTree - Observer oder Listener? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben