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.
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.
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...
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:
Dann muss der Transferhandler angelegt werden (die Methoden müssen nach eigenen Bedürfnissen implementiert werden):
Java:
publicclassMyTransferHandlerextendsTransferHandler{privateString data;publicMyTransferHandler(){}publicMyTransferHandler(String data){this.data= data;}publicTransferablecreateTransferable(JComponent c){this.tid =String.valueOf(((TextbausteinTree)(BuchungenKunde.getTree().getLastSelectedPathComponent())).getTid());TransferableData tData =newTransferableData(this.data);return tdata;}publicintgetSourceActions(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:
Java:
publicclassTransferableTidimplementsTransferable{String data;publicTransferableTid(String data){this.data= data;}//Gibt das Objekt zurück das die zu transferierenden Daten darstellt@OverridepublicObjectgetTransferData(DataFlavor flavor)throwsUnsupportedFlavorException,IOException{return data;}@OverridepublicDataFlavor[]getTransferDataFlavors(){returnnewDataFlavor[]{DataFlavor.stringFlavor};}@OverridepublicbooleanisDataFlavorSupported(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.