# Drag and Drop von JTree auf JPanel



## DeepBlue (7. Okt 2005)

Hio

Ich hab mal eine wieder eine Stelle, an der ich nicht weiterkomme und ich hoffe, dass mir einer helfen kann. 
Ich habe einen JTree mit einem TreeModel in dem eigene Objekte sind. Diese Objekte besitzen ein Interface, dass beschreibt wie diese gezeichnet werden können. Nun möchte ich mittels Drag und Drop diese Objekte aus dem JTree auf ein JPanel droppen lassen und sie genau da zeichnen lassen, wo sie gedroppt wurden. Bzw möchte ich, dass sie einem Vector hinzugefügt werden, der alle zu zeichnenden Objekte enthält.

Mein Problem ist nun, dass ich nicht genau weiß, was ich für die Drag und Drop Lösung alles einbinden muss. Ich habe nun mehrere TuTs darüber gelesen, die mir insgesamt aber nur bedingt weiterhelfen konnten. Sicherlich müssen meine Objekte noch das Interface "Transferable" implementieren, oder ? Zudem brauch ich einen TransferHandler, den ich bei meiner JPanel anmelde. Beim Jtree muss ich meines Wissen ja nichts verändern sondern nur mittels setDragEnabled(true) das Default Drag und Drop Verhalten einschalten.
Soweit ist mir jetzt alles klar, nur wie bekomme ich z.B. die Koordinaten des Objekts wenn ich es auf das JPanel droppe ? Und wann welchen Listener muss ich nutzen um Aktionen auszuführen sobald das Drag und Drop erfolgreich beendet ist ?

mfg DeeP


----------



## André Uhres (9. Okt 2005)

> Zudem brauch ich einen TransferHandler, den ich bei meiner JPanel anmelde. . 

Beim JPanel könnte man auch einfach ein DropTarget setzen. 
Die Koordinaten stehen in der Methode "drop(DropTargetDropEvent dtde)" zur Verfügung: "dtde.getLocation()". 
Das zu übertragende Objekt wird durch "dtde.getTransferable().getTransferData(...)" geliefert. 
Das eigentliche "Droppen" dürfte dann kein Problem mehr sein.
Hier ein Beispiel für "stringFlavor":

```
final JPanel targetPanel = new JPanel();
        targetPanel.setDropTarget(new DropTarget(targetPanel, new DropTargetAdapter() {
            public void drop(DropTargetDropEvent dtde) {
                Point loc = dtde.getLocation();
                Object obj = null;
                try {
                    obj = dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
                } catch (IOException ex) {
                    ex.printStackTrace();
                } catch (UnsupportedFlavorException ex) {
                    ex.printStackTrace();
                }
                JLabel comp = new JLabel((String)obj);
                targetPanel.setLayout(null);
                targetPanel.add(comp);
                comp.setLocation(loc);
                comp.setSize(100,20);
            }
        }));
```


----------



## André Uhres (9. Okt 2005)

Möglicherweise muss für JTree ein TransferHandler geschrieben werden
der über die Methode "createTransferable(...)" das zu übertragende Objekt weitergibt.


----------



## DeepBlue (10. Okt 2005)

Wow, besten Dank, das werde ich mal ausprobieren. Ist wesentlich einfacher als meine Idee. Allerdings werde ich mir dann noch nen eigenen Flavor definieren müssen, weil ich ja mit eigenen Objekten arbeite. Aber da wäre ich ja so oder so sicherlich nicht drumherum gekommen. 



			
				Andre_Uhres hat gesagt.:
			
		

> Möglicherweise muss für JTree ein TransferHandler geschrieben werden
> der über die Methode "createTransferable(...)" das zu übertragende Objekt weitergibt.



Oder ich implementiere bei meinen Objekten das Interface Transferable. Das sollte auch genügen, oder ?

mfg DeeP


----------



## Guest (10. Okt 2005)

> Allerdings werde ich mir dann noch nen eigenen Flavor definieren müssen
Für de Hausgebrauch könntest du auch einfach in der Methode "canImport(...)" vom TransferHandler
immer "true" zurückgeben, unabhängig vom Flavor. Dann spielt es keine Rolle, mit welchem Flavor du arbeitest.

> Oder ich implementiere bei meinen Objekten das Interface Transferable.
Das musst du sowieso machen, da die drag-and-drop API nur ein Transferable weitergeben kann.


----------



## André Uhres (10. Okt 2005)

Der letzte Beitrag war natürlich von mir.
Hab nur auf nem anderen PC gearbeitet und das Login vergessen.


----------



## DeepBlue (11. Okt 2005)

Besten Dank für deine Hilfe, hat alles geklappt. Für den JTree habe ich einen TransferHandler geschrieben, der die Methoden canImport()  (immer false),  createTransferable() und getSourceActions überschreibt. Für die Objekte, die Transportiert werden, habe ich einen eigenen Flavor definiert und meine Objekte implementieren nun das Transferable Interface.

Vielen Dank nochmal


----------



## André Uhres (11. Okt 2005)

Ja richtig, "getSourceActions" ist auch notwendig im TransferHandler. 
Bin froh, dass ich dir helfen konnte.


----------



## DeepBlue (18. Okt 2005)

Ich muss den Thread nochmal aus der Versenkung holen, weil nochmal ein kleines Problem aufgetaucht ist. Ich würde gerne darauf reagieren, wenn ich etwas aus meinem Tree dragge und noch nicht gedroppt habe. 
Es soll nämlich so sein, dass wenn ich etwas dragge, auf meinem JPanel verschiedene grafische Objekte gehighlighted werden sollen, wenn ich mit einem Element darüber dragge. Ein MouseMotionListener bzw public void mouseDragged reagiert leider nicht.

Hat da vielleicht noch irgendjemand ne Idee ?


----------



## DeepBlue (18. Okt 2005)

Okay, hat sich erledigt, hatte wohl Tomaten auf den Augen ... Die Methode public void dragOver(DropTargetDragEvent) des DropTargetListeners reagiert auf das draggen über dem Panel.


----------

