JTree mit Verzeichnissen füllen

Status
Nicht offen für weitere Antworten.

Big Apple

Aktives Mitglied
Hallo,

kann man den JTree automatisch den Verzeichnissen des Computers füllen ohne erst viel einzutragen?

Schon mal danke für Antworten

Big Apple
 
Also ich finde da zwar wie man einen JTree erstellt und weiteres aber nicht wie ich ihn mit dern Verzeichnissen füllen kann. Wäre nett wenn ihr mir einen Code dazu geben könnt.

Viele Grüße

Big Appple
 
Nun, da steht doch drin, wie man Nodes hinzufügt, gell?
Also listest du einfach alle Verzeichnisse mit der File-Funktion listFiles() auf, und fügst dementsprechend Einträge hinzu.
 
Poste doch mal was du bisher hast. Vielleicht können wir dich dann in die richtige Richtung stoßen... ;-)
 
Mein kompletter code sieht so auf:

Code:
import java.awt.FileDialog;
import java.awt.Scrollbar;
import java.io.*;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.*;

public class dir extends JFrame {

	private static File dir = new File("/Users/PSpooren/Documents");

	private static DefaultMutableTreeNode treeMain = new DefaultMutableTreeNode(
			dir.getName());

	private static DefaultMutableTreeNode treeAlt = treeMain;

	private static DefaultMutableTreeNode treeNeu = null;

	public dir() {

		listDir(dir);

		JTree tree = new JTree(treeMain);
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setViewportView(tree);

		this.add(tree);
	}

	public static void listDir(File dir) {
		File[] files = dir.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()) {
					treeNeu = new DefaultMutableTreeNode(files[i].getName());
					treeAlt.add(treeNeu);
					treeAlt = treeNeu;
					listDir(files[i]);
				} else {
					treeAlt.add(new DefaultMutableTreeNode(files[i].getName()));
				}

			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Automatisch erstellter Methoden-Stub
		dir frame = new dir();
		frame.setVisible(true);

	}

}
 
Dein Code funktioniert bei mir einwandfrei.

Du solltest dir nur angewöhnen Klassennamen einen GROßEN Anfangsbuchstaben zu verpassen!
Und weiterhin kannst du mal versuchen in der Zeile
Code:
private static File dir = new File("C:\\Programme");
wie oben gezeigt einen absoluten Pfad anzugeben. Vielleicht ist da dein Problem...
 
Ja das mit Großbuchstaben mache ich eigentlich auch immer, nur da einmal vergessen.

Also da ich ein Apple haben heißen die Verzeichnisse bei mir etwas anderes.

Das Problem bei dem Code ist dass es immer nur einen Ordner gibt, in dem dann der nächste, und so weiter.
Nie gibt es zwei oder mehr Unterordner.
 
So, hab deine listDir Methode jetzt mal so angepaßt, daß es funktionieren sollte:

Code:
	public static void listDir(File dir) {
		File[] files = dir.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {

				treeNeu = new DefaultMutableTreeNode(files[i].getName());
				treeAlt.add(treeNeu);
				if (files[i].isDirectory()) {
					treeAlt = treeNeu;
					listDir(files[i]);
					treeAlt = (DefaultMutableTreeNode) treeAlt.getParent();
				}
			}
		}
	}
 
Könnt ihr mir auch noch sagen wie ich da nun ein JScrollPanel hinzufügen kann ( also eine Scrollbar).
Ich habe das so versucht was nicht funktioniert:

Code:
		JTree tree = new JTree(treeMain);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		scrollPane.getViewport().setView(tree);
		this.add(tree);
 
bei mir funktioniert es so:

Code:
JTree filetree = new JTree(root);

JScrollPane pane = new JScrollPanel
pane.getViewport().setView(filetree);

JPanel panel = new JPanel(new BorderLayout());
panel.add(pane, BorderLayout.CENTER);

Du musst das ScrollPane adden nicht nicht den tree!!
also bei Dir

Code:
JTree tree = new JTree(treeMain);
      
JScrollPane scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.getViewport().setView(tree);

this.add(scrollPane);
 
ich glaube du must mit der Method add entweder das ScrollPane an den Tree oder den Tree an das ScrollPane adden
 
Du kannst den Tree auch gleich über den Konstruktor der Scrollpane in diese packen:

Code:
JTree tree = new JTree(treeMain); 

/* Scrollpane für den Tree */
JScrollPane treeScrollPane = new JScrollPane(tree);
this.add(treeScrollPane);
 
Mir ist nun noch eine Verbesserung eingefallen. Es wäre viel schneller wenn nicht immer alles geladen werden würde, sondern nur das das grade offen ist. Gesagt getan:

Code:
	public void treeExpanded(TreeExpansionEvent event) {
		DefaultMutableTreeNode treeToExpand = (DefaultMutableTreeNode) event.getPath().getLastPathComponent();
		treeToExpand.removeAllChildren();
		File filesInDirectory = new File(treeToExpand.toString());
		File[] files = filesInDirectory.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				reeNeu = new DefaultMutableTreeNode(files[i].getName());
				treeToExpand.add(treeNeu);
				if (files[i].isDirectory()) {
					treeNeu.add(new DefaultMutableTreeNode("Bitte warten"));
				}
				modTreeMain.reload();
			}
		}
	}

Bei dem ersten Verzeichniss geht das auch wunderbar, dann leider nicht mehr.
Ich weiß auch wodran das liegt, wenn ich treeToExpand in einen String umwandle ist davor immer "[" und dahinter "]".
Das könnte ich mit replace ändern, aber gibt es da keine bessere Lösung?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben