# Drag&Drop einer Datei, wie nur den Dateipfad erhalten?



## Stefan1200 (15. Aug 2003)

ich möchte gerne wissen, wie ich es programmiere, das ich nur den Dateipfad von der Datei erhalte, die per Drag&Drop fallen gelassen wurde. Ich verwende Swing GUIs. 

Ich habe im Internet haufenweise Dokus gefunden zum Thema Drag&Drop, die nur darauf eingehen, wie man die fallengelassene Datei speichert und diese anzeigt. Aber das möchte ich ja nicht. Geht das überhaupt anders?


----------



## bummerland (15. Aug 2003)

du sagst, es wird beschrieben, wie man die fallengelassene datei speichert. wenn du von dieser datei ein File-Object anlegst, bekommst du den Pfad mit file.getDirectory()


----------



## Stefan1200 (18. Aug 2003)

Danke für den Tipp.

Ich habe nochmal einen Text über Drag&Drop gelesen und sogar noch eine einfachere Möglichkeit gefunden, den Pfad zu erhalten.

Aber nun habe ich noch ein anderes Problem.
Ich hoffe Ihr könnt mir da helfen.

Und zwar habe ich jetzt ein kleines Drag&Drop Testprogramm geschrieben, um das son bissel zu üben. Das Programm besteht aus einem JTextField und einem JButton (und ein paar weitere fürs Drag&Drop unwichtige Dinge). Auf dem JButton kann man eine Datei fallen lassen, und im JTextField wird dann der Pfad zu der Datei reingeschrieben.
So viel zu der Erklärung des Programms.

Nun meine Fragen:

1. Wie kann ich heraus bekommen, auf welche GUI Componente die Datei fallen gelassen wurde? Mal angenommen ich habe mehrere JButtons, wie finde ich heraus, das es gerade der 5. JButton war? Mit
e.getSource == bTest
funktionierte es nicht (bTest ist der Instanzierte Name des JButton).

2. Wie baue ich das in meinem Source ein, das ich den Pfad von allen fallengelassenen Dateien erhalte. Mein Test Programm zeigt nur den ersten an. Ich habe zwar schon ein paar Sachen probiert, aber es klappt nicht.
Wenn ich mir die Länge des Flavors anschaue (wie in der for Schleife), steht auch immer nur 1 drin, auch wenn ich mehrere drauf werfe.
Hinweis: Als ich das ausprobiert habe, habe ich natürlich den Programmpfad immer nur hinzu gefügt und nicht wie im jetzigen Source
das ich den Inhalt überschreibe.


Damit Ihr überhaupt versteht, was ich hier schreibe, einmal den Sourcecode unten angehängt. Der Source ist komplett von mir geschrieben, lediglich die öffentliche drop Methode habe ich aus einer Anleitung genommen und für meine Bedürfnisse angepasst und leicht abgeändert.



```
import java.awt.*;					// Need for BorderLayout
import java.awt.dnd.*;				// Need for Drag&Drop
import java.awt.event.*;			// Need for WindowListener
import java.awt.datatransfer.*;		// Need for Transferable
import javax.swing.*;				// Need for Swing GUI Elements

class DnDTest extends JFrame
implements DropTargetListener
{
	JPanel rootGui = (JPanel)getContentPane();
	JLabel lTest = new JLabel("File dropped:");
	JButton bTest = new JButton("Drop file on me!");
	JTextField tfTest = new JTextField();
	DropTarget dt = new DropTarget(this, this);
	
	public DnDTest()
	{
		addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				dispose();
				System.exit(0);
			}
		});
		
		rootGui.setLayout(new BorderLayout());
		
		bTest.setDropTarget(dt);
		tfTest.setEditable(false);
		
		rootGui.add(lTest, BorderLayout.NORTH);
		rootGui.add(tfTest, BorderLayout.CENTER);
		rootGui.add(bTest, BorderLayout.SOUTH);
	}
	
	public static void main(String args[])
	{
		DnDTest initDnDTest = new DnDTest();
		initDnDTest.startMe();
	}
	
	void startMe()
	{
		this.setSize(400, 100);
		this.setTitle("Drag & Drop Test (c) 2003 by SSD");
		this.setVisible(true);
	}

	public void dragExit(DropTargetEvent e)
	{
		tfTest.setText("");
	}

	public void drop(DropTargetDropEvent e)
	{
		try
		{
			Transferable tr = e.getTransferable();
			DataFlavor[] flavors = tr.getTransferDataFlavors();
			for (int i = 0; i < flavors.length; i++)
			{
				if (flavors[i].isFlavorJavaFileListType()) {
			        // Accept dropped file
			        e.acceptDrop (e.getDropAction());
			        // Write the path from the first file into the JTextField tfTest
			        tfTest.setText(tr.getTransferData(flavors[i]).toString().substring(1,tr.getTransferData(flavors[i]).toString().length()-1));
			        e.dropComplete(true);
			        return;
				}
			}
		}
		
		catch (Throwable t)
		{
			t.printStackTrace();
		}
		// If an error occurred
		e.rejectDrop();
		tfTest.setText("");
	}
	
	public void dropActionChanged(DropTargetDragEvent e)
	{
	}
	
	public void dragOver(DropTargetDragEvent e)
	{
	}

	public void dragEnter(DropTargetDragEvent e)
	{
		tfTest.setText("And now release the mouse!");
	}
}
```


----------



## bummerland (19. Aug 2003)

ich hoffe, ich kann dir zu einigen problemen helfen:

1. du kannst dir eine eigene eigene klasse schreiben und von jbutton ableiten. diese klasse lässt du dann die schnittstelle DropTargetListener implementieren.

2. meinst du, wenn du mehrere gleichzeitig draufziehst oder mehrere nacheinander?


----------



## Stefan1200 (19. Aug 2003)

becstift hat gesagt.:
			
		

> ich hoffe, ich kann dir zu einigen problemen helfen:
> 
> 1. du kannst dir eine eigene eigene klasse schreiben und von jbutton ableiten. diese klasse lässt du dann die schnittstelle DropTargetListener implementieren.
> 
> 2. meinst du, wenn du mehrere gleichzeitig draufziehst oder mehrere nacheinander?




1. Hmm, dann muss ich ja für jeden einzelnen Button eine eigene Klasse schreiben ?!? Es muss doch irgendwie eine einfachere Lösung geben.
Ich dachte eigentlich, das die Überprüfung genauso geht, wie beim ActionListener, in dem ich einfach e.getSource mache, und diesen entweder mit dem JButton vergleiche oder halt per JButton instanziere und infos (zB. den Button Text) abfrage.

Nur leider funktioniert das mit dem DropEvent nicht. Wofür ist da eigentlich e.getSource da?

Welche Möglichkeit gibt es noch, das ich die Drop Quelle erfahren kann?


2. Mehrere Gleichzeitig. Ich weiss, dass es geht. Aber mein Problem: Wie geht das? 


Hat überhaupt schon jemand mit Drag&Drop gearbeitet, oder tappen gerade alle genauso im Dunkeln wie ich?


----------



## Stefan1200 (25. Aug 2003)

Hat echt keiner eine Idee?
Ich stehe ein bissel auf dem Schlauch was Drag&Drop angeht, komme einfach nicht weiter.

Schade, das dieses Thema nicht im JavaBuch behandelt wird.


----------



## Stefan1200 (17. Sep 2003)

Ich habe jetzt mal beim DropTargetDropEvent mal versucht mit e.getLocation() die Quelle herauszufinden. In dem ich this.getComponentAt(e.getLocation()) gemacht habe. Das Problem ist, ich bekomme nur ein JRootPane Objekt zurück. Weiterhin ist e.getLocation() dafür sinnlos, weil es nur den Point anzeigt ausgehend von dem JButton wo ich eine Datei fallen gelassen habe.

Weiterhin ist mir aufgefallen, das e.getSource() doch funktioniert.
Allerdings gibt er mir nicht wie erwartet den JButton zurück, auf dem ich die Datei fallen lies, sondern genau wie this.getComponentAt(e.getLocation()) gibt auch e.getSource() mir den JRootPane zurück. Damit kann man aber nicht rausfinden, auf welchen Button die Datei gefallen ist, oder?

Bitte helft mir, ich möchte nicht zu blöd für Drag&Drop sein ;-)


----------



## DTR (17. Sep 2003)

Hast du dir mal den DropTargetContext angesehen?


----------



## Stefan1200 (17. Sep 2003)

DTR hat gesagt.:
			
		

> Hast du dir mal den DropTargetContext angesehen?



Das funktioniert dann wie, ausgehend vom obigen Source?


----------



## DTR (17. Sep 2003)

Das kann ich dir auch nicht sagen. Mit Drag&Drop habe ich mich noch nicht beschäftigt. Aber ich habe mich mal in der API umgesehen. Ausgehend von deinem DropTargetDropEvent und habe mir mal die Namen und beschreibungen der Methoden angesehen, was so in die Richtung geht den Button zu finden. Und bei DropTargetContext habe ich ein Methode gefunden die eine Component zurückgibt. Ich denke das du die Mal probieren solltest. Vieleicht hilts ja.


----------

