Problem: FileBrowser mit JTree

Na, wie weit bis du mit deinem JTreeFileChooser?

Lösungsansatz:
Im SelectionListener aus dem Knotennamen eine File generieren. Dann per isDirectory prüfen ob es sich um Ordner handelt. Wenn ja mit listFiles() alle Dateien und Ordner aus diesem Pfad holen, daraus DefaultMutableTreenodes erzeugen und an diesem Pfad einbinden.


Vg Erdal
 
hmm, also im moment steck ich glaub ich irgendwie fest.
also ich habe es geschafft mit Hilfe von root.getChildCount und root.getChildAt einen bestimmten Knoten bzw. Ast zu finden. Aber ich hab irgendwie das gefühl das wenn ich später mal 4 oder 5 Ordnerebenen auf habe ein problem bekomme. Wenn ich das ganze rekursiv oder wie auch immer löse, brauch ich sowie ich das sehe ein node-array da ich ja sonst die ganzen ordner auf einer ebene habe oder nicht? also im moment bin ich echt am verzweifeln. :(
 
Hallo Daniel,

als erstes solltest du in deinem FileTree der Wurzel den Namen C:\\ vergeben. Danach die Dateien mit ihren Namen als nodes dem root übergeben. Die Ordner sollten heißen: Name + "\\". So solltest du den Tree zunächst aufbauen.

SelectionListener:
1. Hier mit einer Schleife kompletten Pfad für den ausgewählten Knoten aufbauen - getNewLeadSelectionPath(), getLastPathComponent(), getUserObjectPath()
2. Ein File Objekt mit diesem Pfad erzeugen. - File file = new File(path);
3. Überprüfen ob es sich um ein Verzeichnis handelt - isDirectory()
4. Wenn ja, alle Dateien und Ordner dieses Ordners holen - file.getFiles()
5. Analog zur Erstellung des Trees, Knoten erzeugen und an den Selektierten Knoten binden.

Hinweis: Da der Tree immer bei Bedarf erweitert wird, brauchst du keine Rekursion

Vg Erdal
 
Hallo Daniel,

Lösungsvorschlag:

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;

public class JTreeFileChooserExample extends JFrame {

	private JFileTree t = new JFileTree();

	private JLabel l = new JLabel(" ");

	public JTreeFileChooserExample() {
		super("JTree FileChooser Example");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setSize(480, 320);

		t.getSelectionModel().addTreeSelectionListener(
				new TreeSelectionListener() {
					private File file;

					private File[] files;

					private DefaultMutableTreeNode dmt;

					private Object[] o;

					private String s = "";

					public void valueChanged(TreeSelectionEvent e) {
						dmt = null;
						dmt = (DefaultMutableTreeNode) e
								.getNewLeadSelectionPath()
								.getLastPathComponent();

						o = dmt.getUserObjectPath();
						s = "";
						for (Object ob : o) {
							s = s + ob;
						}

						file = new File(s);

						l.setText(file.getAbsolutePath());

						if (file.isDirectory())
							if ((files = file.listFiles()).length > 0) {
								dmt.removeAllChildren();
								for (int ast = 0; ast < files.length; ast++) {
									if (files[ast].isDirectory())
										dmt.add(new DefaultMutableTreeNode(
												files[ast].getName() + "\\"));
									else
										dmt.add(new DefaultMutableTreeNode(
												files[ast].getName()));
								}
								t.validate();
							}
					}
				});

		this.add(new JScrollPane(t), BorderLayout.CENTER);
		this.add(l, BorderLayout.SOUTH);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new JTreeFileChooserExample();
	}

	class JFileTree extends JTree {

		public JFileTree() {
			this.setModel(new DefaultTreeModel(this.getRoot()));
			this.setCellRenderer(new FileRenderer());
		}

		public DefaultMutableTreeNode getRoot() {
			File f = new File("C:\\");
			File[] files = f.listFiles();
			DefaultMutableTreeNode root = new DefaultMutableTreeNode(f
					.getPath());
			for (int ast = 0; ast < files.length; ast++) {
				if (files[ast].isDirectory())
					root.add(new DefaultMutableTreeNode(files[ast].getName()
							+ "\\"));
				else
					root.add(new DefaultMutableTreeNode(files[ast].getName()));
			}
			return root;
		}

		class FileRenderer extends DefaultTreeCellRenderer {
			private Icon directoryIcon;

			public FileRenderer() {
				directoryIcon = this.getDefaultClosedIcon();
			}

			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);
				if (isDirectory(value))
					setIcon(directoryIcon);

				return this;
			}

			private Object[] o;

			private String s;

			private File file;

			protected boolean isDirectory(Object value) {
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
				o = node.getUserObjectPath();
				s = "";
				for (Object ob : o) {
					s = s + ob;
				}
				file = new File(s);
				if (file.isDirectory())
					return true;
				else
					return false;
			}
		}
	}
}


Vg Erdal
 
cool danke, jetzt klappts, hab deinen lösungsvorschlag noch ein bisschen modifiziert und jetzt läufts so wie ich das haben will. :)

Jetzt hab ich noch ne weitere Frage und zwar möchte die Dateien des ausgewählten ordners in einem JTable anzeigen aber irgendwie bekomme ich da weder ne spalte noch sonst irgendwelchen inhalt rein. bleibt immer nur grau die Tabelle. :(
hat da jemand vielleicht ein kleines Beispiel wie man so ein TableModel aufbauen kann, und zwar am besten so das man es wärend der Laufzeit auch ändern kann?
 
ja mach ich, dauert aber noch bis mittwoch, vorher komm ich noch nicht aufer arbeit.
Das letzte was ich vorhin aufer arbeit gemacht hatte, war eine eigen JTable-Klasse schreiben.
Hab dann auch mal so ein paar sachen hier aussem forum probiert, aber beim versuch das zu modifizieren kam dann irgendwie immer nur müll bei rum. aber wie gesagt ich meld mich mittwoch nochmal wieder. :)
 
so, also das mit der auflistung der Dateien in einer JTable hat jetzt funktioniert :-)
aber jetzt gibt es selbstverständlich ein weiteres Problem:
Ich möchte mir von jeder Datei den Hashwert anzeigen lassen.
Ich hab schon ausprobiert die Dateien in ein Objekt zu packen und dann mit object.HashCode den Hashwert zu ermitteln. Allerdings scheint das nicht richtig zu funktionieren, weil wenn ich 2 Dateien mit dem gleichen Inhalt habe, die aber unterschiedliche Dateinamen haben, dann müsste der Hashwert doch identisch sein oder?
Falls sich damit jemand auskennt, wie man sowas macht, würde ich mich sehr über Hilfe freuen.
 
so das mit dem hashwert hat auch gefunzt, hab dafür einfach ne externe klasse eingebunden. jetzt muss ichs noch irgendwie hinbekommen das ich das nach spalten sortieren kann. aber das soll auch wohl irgendwie gehen, wenn nicht dann meld ich mich
 
Zurück