Problem: FileBrowser mit JTree

Djunix

Mitglied
Hallo,
ich bin zur Zeit dabei mir eine Art Filebrowser zu erstellen.
Dazu benutze ich eine JComboBox zum auswählen desLaufwerkes und einen JTree um die darin enthaltenen Ordner aufzulisten.
Jetzt habe ich allerdings ein paar Probleme:
1. In der ComboBox erscheinen bei den Wechselmedien(Floppy, CD, DVD) nicht die Namen wenn man diese mit
Code:
FileSystemView view = FileSystemView.getFileSystemView();
for ( File f : File.listRoots() )
{			
	combo_drive.addItem(view.getSystemDisplayName(f));
}
in die ComboBox hinzufügt.

2.Bei der Auswahl der Windows-Partition, zeigt er mir den Inhalt meines Projekt-Ordners, aber bei allen anderen Partitionen die darin enthaltenen Ordner. Warum macht der das bei der Windows-Partition nicht vernünftig?

Hoffe ihr könnt mir weiterhelfen.
Gruß
Daniel
 
Hallo Daniel,

statt die Werte gleich in eine Combo zu packen, probier doch die einzelnen Methoden einfach mal aus:

Java:
import java.io.File;
import java.io.PrintStream;

import javax.swing.filechooser.FileSystemView;

public class FileSystemInfo {

	private static PrintStream o = System.out;

	public static void main(String[] args) {
		FileSystemView view = FileSystemView.getFileSystemView();
		for (File f : File.listRoots())
			o.println(view.getSystemTypeDescription(f));
		o.println();
		for (File f : File.listRoots())
			o.println(view.getSystemDisplayName(f));
		o.println();
		for (File f : File.listRoots())
			o.println(view.getSystemIcon(f));
		o.println();
		o.println(view.getDefaultDirectory());
		o.println();
		o.println(view.getHomeDirectory());
		o.println();
		for (File f : File.listRoots())
			o.println(view.getParentDirectory(f));
	}
}


Code:
SystemTypeDescription:
Lokaler Datenträger
Lokaler Datenträger
Lokaler Datenträger
Lokaler Datenträger
CD-Laufwerk
Wechseldatenträger
SystemDisplayName:
Lokaler Datenträger (C:)
Lokaler Datenträger (D:)
Lokaler Datenträger (E:)
Lokaler Datenträger (F:)


SystemIcon:
Lokaler Datenträger
Lokaler Datenträger
Lokaler Datenträger
Lokaler Datenträger
CD-Laufwerk
Wechseldatenträger
DefaultDirectory:
C:\Dokumente und Einstellungen\Muhlasin\Eigene Dateien
HomeDirectory:
C:\Dokumente und Einstellungen\Muhlasin\Desktop
ParentDirectory:
Arbeitsplatz
Arbeitsplatz
Arbeitsplatz
Arbeitsplatz
null
null

Was mir jetzt so auf anhieb auffällt ist, das der Name für das CD-Laufwerk fehlt. Das herauszufinden wäre dann kein so großes Problem, der Reihe nach müsste es hier (G: ) sein.

Was die Partitionen angeht, weiß ich nicht genau was du meinst.


Vg Erdal
 
Also erstmal Danke für die Hilfe, auch wenn mich das im Moment nicht viel weiterbringt.
Ich hab mitlerweile rausgefunden das es daran liegt das die Laufwerke keinen Datenträger enthalten, wenn ich ins CD-Laufwerk ne CD einlege, dann zeigt er mir den Laufwerksnamen auch in der Combobox an. Ist zwar ein bisschen blöd, aber da kann man anscheinend nichts machen.

Zu der Sache mit der Partition:
Wenn ich mir die Verzeichnisse eines bestimmten Pfades anzeigen lasse (z.B.: D:\) und zwar so:
Code:
File f= new File(path);
files=f.listFiles();
			
for ( int ast = 0; ast < files.length; ast++ )
{
     System.out.println(files[ast]);
}
dann zeigt er mir alle Ordner an die unter D:\ liegen, z.B.:
D:
|-Ordner1
|-Ordner2
|-OrdnerN

Wenn ich als Pfad C:\ angebe gibt er mir nur die Dateien aus meinem Projektverzeichnis im eclipse-workbench an.
 
Hallo Daniel,

also bei mir zeigt er beide richtig an. D.h er listet sowohl sämtliche Ordner als auch Dateien. Kann es vielleicht sein das du nicht als Administrator angemeldet bist, und somit keinen uneingeschränkten Zugriff auf C: hast?

Java:
import java.io.File;
import java.io.PrintStream;

public class FileSystemInfo2 {

	private static PrintStream o = System.out;

	public static void main(String[] args) {
		File f = new File("C:/");
		File[] files = f.listFiles();
		o.println("----- Content of C:/ -----");
		for (int ast = 0; ast < files.length; ast++) {
			o.println(files[ast]);
		}
		f = new File("D:/");
		files = f.listFiles();
		o.println("\n----- Content of D:/ -----");
		for (int ast = 0; ast < files.length; ast++) {
			o.println(files[ast]);
		}
	}
}

Code:
----- Content of C:/ -----
C:\AUTOEXEC.BAT
C:\boot.ini
C:\bootfont.bin
C:\Config.Msi
C:\CONFIG.SYS
C:\Dokumente und Einstellungen
C:\gs
C:\hiberfil.sys
C:\IO.SYS
C:\JAVA
C:\MSDOS.SYS
C:\My Shared Folder
C:\NTDETECT.COM
C:\ntldr
C:\out.jpg
C:\pagefile.sys
C:\Programme
C:\RECYCLER
C:\System Volume Information
C:\Thumbs.db
C:\WINDOWS

----- Content of D:/ -----
D:\antivir_workstation_win7u_de_h.exe
D:\dotnetfx.exe
D:\eclipse-SDK-3.1.2-win32
D:\eclipse-SDK-3.1.2-win32.zip
D:\Firefox Setup 1.5.0.1.exe
D:\Fragen.txt
D:\galileocomputing_javainsel5.zip
D:\GoogleToolbarInstaller.exe
D:\HTML_CSS_Aufgaben.txt
D:\Hutbe
D:\Java_Aufgaben.txt
D:\jre-1_5_0_06-windows-i586-p.exe
D:\Leitfaden.txt
D:\MSOCache
D:\nhc_1.10_beta01.zip
D:\NUR20_060326_BETA
D:\NUR20_060326_BETA.exe
D:\OOo_2.0.1_Win32Intel_install_de.exe
D:\phase5.exe
D:\QuickDic59_db43.exe
D:\RECYCLER
D:\RegSeeker.zip
D:\selfhtml811.zip
D:\System Volume Information
D:\wrar351d.exe


Vg Erdal
 
ah, ich idiot, hatte bei der Angabe des Laufwerkes nur C:, mit C:\ klappts, danke wär ich ohne dein beispiel wahrscheinlich nicht drauf gekommen. :)

jetzt hab ich allerdings noch ein weiteres problem, das ist ein bischen komplexer:
Ich hab mir für die Treeansicht ne eigene Klasse geschrieben
Code:
public class JTreeFolder extends JScrollPane 
{
    protected JTree tree_folder=null;
    public JTreeFolder(String path)
    {
	super();
        //Diverser Code....
    }
}

Wenn ich jetzt in der main-Klasse einen TreeSelectionListener adden will, dann klappt das nicht:
Code:
public class frm_main extends JFrame 
{
     private JTreeFolder getTree_folder() {
	   
		if (tree_folder == null) {
			tree_folder = new JTreeFolder("(D:)");
		}
				
		tree_folder.getSelectionModel().addTreeSelectionListener(
			new TreeSelectionListener(){
				public void valueChanged( TreeSelectionEvent e)
				{
					TreePath path = e.getNewLeadSelectionPath();
					System.out.println(path);
				}
			}
		);
		
		return tree_folder;
		
	}
}
meine Vermutung ist das es daran liegt das meine selbsgeschriebene Tree-Klasse keine Methode getSelectionModel() bzw. addTreeSelectionListener beinhaltet.
Innerhalb der Tree-Klasse habe ich die wohl zur Verfügung wegen
Code:
protected JTree tree_folder=null;"
ich kann also innerhalb der Tree-Klasse eienen Listener anlegen, aber da bringt er mir ja nichts, ich muss es also irgendwie hinbekommen das ich der Main-Klasse diese Methode bekannt mache.

Das ist jetzt glaub ich mal ziemlich kompliziert, hoffe ihr versteht mich trotzdem.
 
Hallo Mensch,

Djunix hat gesagt.:
ah, ich idiot, ...

Das müsste richtig heißen, "ach ich Mensch". Menschen machen Fehler, schon vergessen. Naja soviel zur Philosophie.

Wenn du deine eigene Treeklasse geschickt implementierst hast du keine derartigen Probleme. Für solche Vorhaben ist die Regel eine eigene Klasse zu schreiben welche von der bestehenden zu modifizierenden erbt. So hasst du dann auf alle public Attribute und Methoden der ursprünglichen Klasse Zugriff.

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

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

public class JTreeSelectionListenerExample extends JFrame {

	private JSuperTree t = new JSuperTree();

	private JLabel l = new JLabel(" ");

	public JTreeSelectionListenerExample() {
		super("Example");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setSize(200, 300);

		t.getSelectionModel().addTreeSelectionListener(
				new TreeSelectionListener() {
					public void valueChanged(TreeSelectionEvent e) {
						l.setText(e.getPath().toString());
					}
				});

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

		this.setVisible(true);
	}

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

	static class JSuperTree extends JTree {
		private Color c = Color.PINK;

		public JSuperTree() {
			// Hier Änderungen vornehmen
			super(getRoot());
			this.setBackground(c);
			tueJenes();
			tueDies();
		}

		public void tueJenes() {
			// 
		}

		public void tueDies() {
			//
		}

		public static DefaultMutableTreeNode getRoot() {
			File f = new File("C:/");
			File[] files = f.listFiles();
			DefaultMutableTreeNode root = new DefaultMutableTreeNode(f
					.getAbsolutePath());
			for (int ast = 0; ast < files.length; ast++) {
				DefaultMutableTreeNode node = new DefaultMutableTreeNode(
						files[ast]);
				root.add(node);
			}
			return root;
		}
	}
}


Vg Erdal
 
so, ich habs jetzt mal ausprobiert, klappt auch ganz gut, allerdings musste ichs ein wenig anders lösen, da an der bestehenden Klassenstruktur zuviel dranhing als das ich das einfach so hätte ändern können. habe mir jetzt die methoden zum erstellen des TreeListener verfügbar gemacht indem ich in der Tree-Klasse einfach:
Code:
public TreeSelectionModel getSelectionModel()
{
	return tree_folder.getSelectionModel();
}
eingebaut habe. :)

Jetzt muss ich nur noch irgendwie lösen das ich in einen bestimmten ast weitere Äste einbauen kann.
Da es im moment so ist das mir nur die erste Ordnerebene angezeigt wird, also so:
D:\
|-1
|-2
|-3

und wenn man dann auf 1 klickt, soll er unter 1 die zugehörigen äste anzeigen.
D:\
|-1
|-1.1
|-1.2
|-2
|-3

vieleicht hat dafür ja auch noch jemand ne lösung, find ich ja echt gut das hier einem so toll geholfen wird. auch wenn man nicht immer direkt die 100%ig passende Lösung bekommt, dann immerhin einen Denkanstoß, was ja eigentlich noch besser ist, da man dann selbst auch noch ein wenig überlegen muss.
 
Sagt dir das Wort "Rekursion" etwas. Einfach in deiner Methode in welcher du die Treenode Einträge machst, für jede Datei nochmals die gleiche Methode aufrufen.

Vg Erdal
 
ja daran hab ich auch schon gedacht, mein problem ist im moment allerdings das wenn ich sofort beim start des programms die komplette Verzeichnisstruktur von C:\ oder D:\ im Tree erstelle, es ziemlich auf die performance geht.
Ich muss es also irgendwie hinbekommen, das ich den aktuell ausgewählten Pfad übergebe und er mir dann die nächste Ordnerebene einbindet.
So das erst beim anklicken eines Ordners seine Unterordner ausgelesen und dargestellt werden. Mal schauen, das kann man wahrscheinlich auch irgendwie mit rekursion lösen.
 

Neue Beiträge

Zurück