# Drag an Drop vom JTree zur JTable



## Christian030783 (10. Nov 2009)

Hallo Zusammen,
ich möchte in meinem Programm per Drag and Drop ein Element von einem JTree in eine JTable ziehen können. JTree und JTable liegen in verschiedenen Klassen in verschiedenen Panels. Gibt es eine Möglichkeit dies zu realisieren?

Bei Google oder im Forum finde ich nur Ergebnisse zu DnD im JTree oder in der JTable, aber nicht von einem zum anderen. DnD innerhalb der JTable funktioniert bereits, DnD innerhalb des JTrees habe ich über einen MouseListener realisiert.

Danke im Vorraus.
Grüße
Christian


----------



## Beni (10. Nov 2009)

Ich würde mir mal das Package java.awt.dnd genauer anschauen. Wenn mich nicht alles täuscht, kriegst du damit sogar DnD mit anderen Programmen (die nicht in Java geschrieben sind) hin.


----------



## Christian030783 (10. Nov 2009)

In welcher Klasse muss ich die dnd-Methoden (DragGestureListener, DragSourceListener etc.) denn implementieren? In der Klasse in der ich den JTree benutzte oder muss ich mir eine eigene JTree-Klasse erstellen und die Klassen dort implementieren? Stehe irgendwie auf dem Schlauch...


----------



## KrokoDiehl (10. Nov 2009)

Schau dir mal das DnD Tutorial von Sun an, da ist im Grunde alles beschrieben, was du brauchst.


----------



## Christian030783 (11. Nov 2009)

Habe es hinbekommen, war im Endeffekt einfacher als gedacht.

Für alle die dies auch realisieren wollen:
Ich habe beim tree die Drag-Funktionalität aktiviert und einen eigenen Transferhandler zugewiesen, da meine Nodes abgesehen von einem Namen noch weitere Daten enthalten:

```
tree.setDragEnabled(true);
tree.setTransferHandler(new MyTransferHandler());
```
Dann muss der Transferhandler angelegt werden (die Methoden müssen nach eigenen Bedürfnissen implementiert werden):

```
public class MyTransferHandler extends TransferHandler{

    private String data;
	
    public MyTransferHandler(){
    }
	
    public MyTransferHandler(String data){
        this.data= data;
    }
	
    public Transferable createTransferable(JComponent c){		
        this.tid = String.valueOf(((TextbausteinTree)(BuchungenKunde.getTree().getLastSelectedPathComponent())).getTid());
		
        TransferableData tData = new TransferableData(this.data);
        return tdata;
    }
	
    public int getSourceActions(JComponent c){
        return COPY;
    }

    //nur zur Veranschaulichung welche Methode wann gerufen wird
/*
    public void exportAsDrag(JComponent comp, java.awt.event.InputEvent e, int action){
        System.out.println("exportAsDrag");
        super.exportAsDrag(comp, e, action);
    }
	 
    public void exportDone(JComponent source, Transferable data, int action){
        System.out.println("exportDone");
        super.exportDone(source, data, action);
    }
*/
}
```
Dann muss das Interface java.awt.datatransfer.Transferable implementiert werden:

```
public class TransferableTid implements Transferable{
	
    String data;
	
    public TransferableTid(String data){
        this.data= data;
    }

    //Gibt das Objekt zurück das die zu transferierenden Daten darstellt
    @Override
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        return data;
    }

    @Override
    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] {DataFlavor.stringFlavor};
    }

    @Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.equals(DataFlavor.stringFlavor);
    }
}
```
Dann muss in der Klasse mit der JTable nur noch der DropTargetListener implementiert werden und es kann mit den transferrierten Daten gearbeitet werden.

```
public class KlasseMitJTable implements DropTargetListener{
    //blabla irgendein Code
    table.setDragEnabled(true);
    //blabla irgendein Code

    public void dragEnter(DropTargetDragEvent dtde) {
    }

    public void dragExit(DropTargetEvent dte) {
    }

    public void dragOver(DropTargetDragEvent dtde) {
    }

    public void drop(DropTargetDropEvent e) {
        Transferable tr = e.getTransferable();
        if(tr.isDataFlavorSupported(DataFlavor.stringFlavor)){
            System.out.println(tr.getTransferData(DataFlavor.stringFlavor));
        }
    }

    public void dropActionChanged(DropTargetDragEvent dtde) {	
    }
}
```

Danke für die nützlichen Hinweise!


----------

