wiedermal JTree Problem

afurtenbacher

Grünschnabel
Hallo zusammen!

Ich habe viele Beiträge hier über JTrees gelesen, habe aber immernoch einige Probleme.
Ziel: Eein Explorer-JTree der mir nur directories anzeigt und neben jedem Knoten eine Checkbox hat. Das ganze soll dazu verwendet werden Ordner indizieren zu lassen.
Vielleicht hat aber auch jemand eine Idee wie das besser geht als mit einem JTree?!

Hier meine Probleme:
1) Wenn ich auf den Rootknoten (c:) klicke, geht nachher nichts mehr. Heißt ich kann keinen anderen Knoten mehr öffnen, schließen oder sonstwas machen.
2) Mein Renderer will auch nicht so ganz. Er zeigt mir zwar jedes Element als Ordner an, aber eigentlich hätte ich lieber daß das System-icon verwendet wird.
3) und zu guter Letzt habe ich noch keinen Plan wie ich das mit den Checkboxen machen soll.

Hier mein Code.
Code:
import java.awt.Component;
import java.io.File;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;

public class TestTreeView extends JFrame{
	private static final long serialVersionUID = 1L;
	private JTree fileTree;
	FileSystemView fsv = FileSystemView.getFileSystemView();
	DefaultTreeCellRenderer cellRenderer = new FileRenderer();
	
	
	public TestTreeView() {
		super("Ordner auswählen");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setAlwaysOnTop(true);
        this.setLocationByPlatform(true);
        this.setSize(480, 320);
		SwingUtilities.updateComponentTreeUI(this);
        DefaultMutableTreeNode rootnode = new DefaultMutableTreeNode(fsv.getRoots()[0]);
        Vector<DefaultMutableTreeNode> subNodes = getSubNodes(rootnode);
        for (int i=0; i<subNodes.size(); i++) {
        	rootnode.add(subNodes.get(i));
        }
        fileTree = new JTree(rootnode);
        fileTree.setCellRenderer(cellRenderer);
        fileTree.getSelectionModel().addTreeSelectionListener(
            new TreeSelectionListener() {
                public void valueChanged(TreeSelectionEvent e) {
                	if (e.getNewLeadSelectionPath() != null) {
                		DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) e.getNewLeadSelectionPath().getLastPathComponent();
                    	Vector<DefaultMutableTreeNode> subNodes = getSubNodes(selectedNode);
                    	selectedNode.removeAllChildren();
                    	for (int i=0; i<subNodes.size(); i++) {
                    		selectedNode.add(subNodes.get(i));
                        }
                	}
                }
            });
        this.add(fileTree);
        this.pack();
        this.setVisible(true);
	}
	
	public Vector<DefaultMutableTreeNode> getSubNodes(DefaultMutableTreeNode rootnode) {
		Vector<DefaultMutableTreeNode> subNodes = new Vector<DefaultMutableTreeNode>();
		File rootNodeFile = getFileFromNode(rootnode);
		if (rootNodeFile.listFiles() != null) {	//muß überprüft werden da ordner auf die nicht zugegriffen werden DARF "null" zurück liefern
			File[] subFiles = rootNodeFile.listFiles();
			for (int i=0; i<subFiles.length; i++) {
	            if (subFiles[i].isDirectory()) {
	            	subNodes.add(new DefaultMutableTreeNode(subFiles[i].getName()));
	            }
			}
		}
		return subNodes;
	}
	
	private File getFileFromNode(DefaultMutableTreeNode node) {
		Object[] o = node.getUserObjectPath();
        String pfad = "";
        for (Object ob : o) {
            pfad = pfad + ob + "\\";
        }
		return new File(pfad);
	}
	
	class FileRenderer extends DefaultTreeCellRenderer {
		private static final long serialVersionUID = 1L;
		public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
            super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
            setIcon(this.getDefaultClosedIcon());
            return this;
        }
	}
}

Bitte um Hilfe

lg,
Andreas
 
Hi! Also ich hab dir einfach mal meinen JDirectoryChooser angehängt (die Quellen).
Wie das aussieht kannst du auch im Anhang sehen. Normalerweise hätte ich gesagt das es reicht das die Klasse DirectoryTreeRenderer statt von einem JLabel von einer JCheckBox abgeleitet wird.. Das klappt aber nicht wirklich, wieso weiß ich grad leider auch nicht ^^

//edit: http://www.codeguru.com/java/articles/185.shtml

Gruß
Tobias
 

Anhänge

  • Zwischenablage01.jpg
    Zwischenablage01.jpg
    34 KB · Aufrufe: 142
  • src.zip
    src.zip
    8 KB · Aufrufe: 94
Zuletzt bearbeitet:
Hallo!

VIELEN DANK das sieht SUUUUUPER aus.
Aber natürlich habe ich als noch einige Fragen. :confused:
Was macht die "Unterordner" Checkbox? Ich konnte noch keinerlei Funktion dabei feststellen...

Das mit den Checkboxen muß ich mir noch genauer anschauen. Ich bin sicher da werde ich dann auch noch Hilfe brauchen :-)

lg,
Andreas

p.s.: danke nochmal! das ist echt genial!
 
Öhm naja, die Funktion ist eigtentlich für Programme gedacht die diesen Dialog nutzen. Wenn das Programm wissen muss ob z.B. auch Unterverzeichnisse eingelesen werden sollen (wofür auch immer) kann es mit jDirChooser.isSubdirChoiceChecked() den Status der Checkbox abfragen. Ich hab das halt bei allen meinen Programmen so benötigt, wenn du das nicht brauchst kannst du es ja per Konstruktor deaktivieren.

Gruß
Tobias
 
ich habe jetzt mal deinen code soweit zusammengetrimmt bis er vom äusseren nur mehr das kann was ich brauche (ich habe mir noch nicht die arbeit gemacht zu versuchen alles davon zu verstehen).

nur das mit den checkboxen ist ein bissl ein hund. in dem link den du gepostet hast, wird der name einer node zusammengesetzt aus einer checkbox und einem label. jetzt habe ich versucht das einzubauen, stoße aber auf massive probleme.
erstens überschreibt die checkbox das foldericon, zweitens sind die zeilen zu niedrig, sodaß nicht die ganze checkbox angezeigt wird, drittens sind trotz "getpreferredsize" die labels zu kurz sodaß nur ein kleiner teil des orndernamens angezeigt wird :-(

hast du vielleicht noch eine quelle in der sowas verwirklicht wird?

lg,
Andreas
 
Hi! Also ich hab dir einfach mal meinen JDirectoryChooser angehängt (die Quellen). (...)
Gruß
Tobias

Echt klasse, Dein DirectoryChooser! Und m.E. besser als der von l2fprod.com !
Ich probiere gerade alles mögliche durch, um eine Methode "setSelectionPath" hinzuzufügen. Beim Öffnen soll ein bestimmtes Verzeichnis vorausgewählt sein. Kriege ich aber leider nicht hin. Hast Du da vielleicht noch einen Tipp?

Vielen Dank...
 
Zurück