verschieben von Dateien auf der Festplatte über TreePaths funktioniert nicht

N4pst3r

Mitglied
Tach

Ich habe in einem JTree eine Drag and Drop Methode eingebaut. Die funktioniert auch wunderbar. Nur sollen sich die Dateien auf der Festplatte ebenfalls verschieben. Allerdings geben mir die zugehörigen Pfade der Dateien aus dem JTree immer solche [C:\, bin, boot.ini] aus. Damit kann ich ja nicht anfangen wenn ich die Dateien über Files verschieben will.
Habt ihr ne Idee wie ich das bewerkstelligen könnte?

relevanter Code:
Java:
public void drop( DropTargetDropEvent dtde ) {

	TreePath tpSelectionPath = tree.getSelectionPath();
	TreePath tpSourcePath = tpSelectionPath.getParentPath();
	DefaultMutableTreeNode dmtSelectedNode = (DefaultMutableTreeNode) tpSelectionPath.getLastPathComponent();

	Point pDropLocation = dtde.getLocation();
	TreePath tpTargetPath = tree.getClosestPathForLocation(
		pDropLocation.x, pDropLocation.y );

	DefaultMutableTreeNode dmtTargetParentNode = (DefaultMutableTreeNode) tpTargetPath.getLastPathComponent();
	DefaultMutableTreeNode dmtSourceParentNode = (DefaultMutableTreeNode) tpSourcePath.getLastPathComponent();

	dmtSourceParentNode.remove( dmtSelectedNode );
	dmtTargetParentNode.add( dmtSelectedNode );

	String sFile = new String( tpSelectionPath.toString() );
	String sDir = new String( tpTargetPath.toString() );

	File fFile = new File( sFile.replaceAll( ", ", "/") );
	File fDir = new File( sDir.replaceAll( ", ", "/") );

	boolean success = fFile.renameTo( new File( fDir, fFile.getName() ) );
	if( !success ) {
		System.out.println( "Konnte die Datei " + fFile + " nicht nach" +
			" " + fDir + " verschieben." );
	}

	System.out.println( "Die Datei: " + fFile );
	System.out.println( "Hier rein: " + fDir );

	dtde.dropComplete( true );
	tree.updateUI();

}
} ) );

Ich habe versucht die Trennungen der Pfade [ , ] mit einem Slash zu ersetzen. Das klappt erstmal recht gut. Allerdings machen mir die eckigen Klammern noch Probleme :bahnhof:
 
Zuletzt bearbeitet:
Was steckt denn in den TreeNodes? Ich würde da das File Objekt reinstecken, dann müsste man sich den Pfad nicht aus den Informationen aus dem TreePath zusammenbasteln. Wenn Da allerdings nur der Dateiname drinsteht, bleibt Dir nichts anderes übrig.
 
Sind nur Namen. Die Nodes werden mit Files über Schleifen befüllt aber denen sind ja nur Namen zugeteilt worden.
Aber ich brauche ja nur den Pfad der selektierten Datei die ich auch mit der DnD-Methode verschiebe. Der wird mir ja nur nicht richtig angegeben
 
Aber ich brauche ja nur den Pfad der selektierten Datei die ich auch mit der DnD-Methode verschiebe.
Du selektierst/verschiebst keine Datei, Du verschiebst nur einen Knoten der einen String enthält, der dem Namen der Datei entspricht. Woher soll der Knoten also den Pfad der Datei kennen?
Deswegen mein Vorschlag das File Objekt in den Knoten zu stecken.
 
ja aber der Baum baut sich genauso auf wie die festplatte deswegen ist der Pfad der Nodes identisch mit dem der Datei die auf der Festplatte verschoben werden soll.
Wie sollte ich denn das File Objekt in den Node stecken?
 
ja aber der Baum baut sich genauso auf wie die festplatte deswegen ist der Pfad der Nodes identisch mit dem der Datei die auf der Festplatte verschoben werden soll.
Der Aufbau des Baumes ist in dem Fall ja egal. (Ausser man benötigt den TreePath o.ä. um den Dateipfad nachzubauen;-)
Wie sollte ich denn das File Objekt in den Node stecken?
Ein DefaultMutableTreeNode kann beliebige Objekte auf nehmen:
Java:
DefaultMutableTreeNode fileNode = new DefaultMutableTreeNode(new File("C:/temp/test.txt"));
Durch Verwendung eines passenden TreeCellRenderers kann man, dann Einfluss auf die Darstellung des Knotens nehmen, z.B. damit nur der Dateiname angezeigt wird.
 
hä? ja moment mal ich glaub wir reden aneinander vorbei 🙂
ohne hier jetzt unendlich viel code zu posten, folgendes:

Ich kann doch den Pfad in dem File-Objekt garnicht angeben wenn der mir nicht bekannt ist.
Ich sehe ja nur den Baum und verschiebe durch Drag and Drop die Verzeichnisse und Dateien (ja sind nur Nodes). Diese sind ja schon als File-Objekte ind die Nodes gebunden worden und haben über eine Schleife einen Pfad mitbekommen (so wie: "C:\Programme\test\test.txt").
Da Ich ja für diesen sozusagen "unendlich großen Baum" nicht jeden Node und jedes File-Objekt manuell verschieben möchte, muss ich in die Methode schreiben, dass die Metode sich den Pfad von dem selektierten Node geben lässt und diesen dann als File-Objekt auf der Festplatte genauso verschiebt wie im Baum.
Da kann ich ja nicht jedes File einzeln mit einem Pfad versehen den ich manuell angebe.

Und genau diesen Pfad für das File möchte ich ja haben.

Ich hoffe das triffts 😉
 
Bin mir auch nicht mehr sicher, ob wir uns richtig verstehen!
Mein Verständnis:
- es wird durch "auslesen" der Festplatte ein Baum erstellt, der die Verzeichnisse und Dateien des Laufwerks repäsentiert
- mittels DnD sollen, Dateien oder ganze Verzeichnisse verschoben werden
==> Also ein Datei Explorer wie in jedes graphische Betriebssystem anbietet?
 
Und eingelesen werden die Daten vermutlich mittels File und listFiles()... ?
Dann hätte man ja die File Objekte und deren Pfad. Wenn man jetzt statt einfach nur den Namen der Datei oder des Verzeichnisses in den TreeNode das File Objekt steckt, kann man jederzeit die Knoten nach dem Pfad der Datei/ des Verzeichnisses fragen, das sie repräsentieren.
Java:
//Erstellen des Baums und der Knoten
...
DefaultMutableTreeNode node = new DefaultMutableTreeNode(new File("C:/temp/test"));
...
//Ein Knoten wird selektiert 
node = (DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent();
String path = ((File)node.getUserObject()).getAbsolutePath();
System.out.println("Der durch den TreeNode repäsentierte Pfad lautet: " + path);
 

Neue Themen


Zurück
Oben