Das mit dem „Rückweg“ bezog sich darauf: In der JTable
wird auf irgendeine Tabellenzelle gedrückt, um das DnD zu starten. Kommt man von der angeklickten Tabellenzelle noch auf das echte, dahinter liegende Part
-Objekt?
So, wie es jetzt formuliert ist, klingt das ja so, als könnte es da eine Stelle geben, wo man alles beisammen hat (Pseudocode)
List<Part> parts = ...;
TableModel model = createModelFrom(parts);
JTable table = new JTable(model);
// Grob wie im verlinkten Beispiel:
DragGestureListener dragGestureListener = new DragGestureListener() {
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
int row = getSelectedRow(table);
Part part = parts.get(row); // HIER hat man das relevante Part-Objekt!
machDamitIrgendwas(part);
}
}
(Es hätte ja sein können, dass man „irgendwo“ eine JTable bekommt, und die Information, in welcher Zeile welches Part
-Objekt steht, durch Zwischen- und Abstraktionsschritte verloren gegangen ist. Eigentlich muss die row
noch von der View ins Modell konvertiert werden, falls die Tabelle z.B. sortiert sein kann…)
Aber falls das ungefähr so ist, kommt man an der „Quelle“ schonmal ohne Probleme an das Part
-Objekt.
Der „Empfänger-Teil“ des Part
-Objekts ist dann das Panel.
Dort soll dann, wenn ich das richtig verstanden habe, das JLabel
angezeigt werden, wenn man droppt, aber auch schon während man das Bauteil nur über das Ziel-Panel drüberzieht.
Das klingt ein bißchen wie etwas, was ich auch schon mal gemacht habe. Aaaber: Das habe ich bisher nur einmal gemacht, und in einem recht „komplizierten“ Zusammenhang, und ich habe mich da auch ein bißchen zum Ziel hingestolpert
D.h. vielleicht gibt es auch eine vieeel einfachere Lösung, die ich nur nicht gefunden habe…
Das ganze ist Teil von GitHub - javagl/Flow: Libraries for flow-based programming :

(Dass das so halbtransparent-grün ist, ist natürlich nur eye candy ;-))
Die relevantesten Teile sind hier wohl…
- Die
dragOver
-Methode, die aufgerufen wird, während man irgendwas über das „Drop Target“ zieht: Flow/ModuleDropTargetListener.java at f972f08cf12336b4118ab1090134509b628667ce · javagl/Flow · GitHub . Die holt sich aus dem Event das Objekt raus (was bei dir eben kein Module
, sondern ein Part
wäre), und kümmert sich drum, dass die Vorschau angezeigt wird. Das Anzeigen der Vorschau passiert in Flow/DragPanel.java at f972f08cf12336b4118ab1090134509b628667ce · javagl/Flow · GitHub . Das ist da wohl etwas komplizierter, als es bei dir sein müßte. Aber über ein paar Fragen wirst du dir auch Gedanken machen müssen. Z.B.: Man zieht ein Part
über das Ziel-Panel. Das passende JLabel wird angezeigt. Man bewegt die Maus aus den Ziel-Panel raus. Dann muss das Label auch wieder entfernt werden!
- In der
drop
-Methode wird dann das JLabel
echt zum Zielpanel hinzgefügt: Flow/ModuleDropTargetListener.java at f972f08cf12336b4118ab1090134509b628667ce · javagl/Flow · GitHub („Echt“ heißt, dass man es nicht mehr wegmachen kann - außer, wenn man es in ein CloseablePanel
einwickelt, oder man die extra Mile geht, und dem ganzen ein STRG+Z-Undo-Handling spendiert: Flow/FlowEditor.java at f972f08cf12336b4118ab1090134509b628667ce · javagl/Flow · GitHub
)
Das ist alles im Rahmen einer „komplexeren“ Applikation, und es gibt sicher Konstellationen, wo das ganze „einfacher“ gelöst werden kann. Bezogen auf das Mini-Beispiel: Dort ist eben nur die drop
-Methode (ziemlich trivial) implementiert. Um das JLabel auch schon beim Drüberziehen anzuzeigen, müßte dort dragOver
passend implementiert werden: JTreeTable/JTreeTableDragAndDropExample.java at master · javagl/JTreeTable · GitHub
Allgemein: DnD ist ziemlich kompliziert, das stimmt. Und alles, was ich hier sage, ist genau unter diesem Vorbehalt zu sehen: Vielleicht gibt es einfachere Lösungen.
Was ich bei DnD schwierig fand: Es gibt zwei verschiedene „Ebenen“, an denen man ansetzen kann: Bei manchen Sachen muss man nur wenige Zeilen Code schreiben, und sowas sagen wie
source.enableDrag(true);
new DropTarget(target);
und dann passiert die ganze Magie automatisch (das ist der „Drafult Support“, der unter Default DnD Support (The Java™ Tutorials > Creating a GUI With JFC/Swing > Drag and Drop and Data Transfer) beschrieben ist).
Aber sobald man auch nur einen Hauch weiter runter muss, muss man sich mit DragGestureListener
, Transferable
, DataFlavor
& Co rumschlagen. So gesehen ist klar, dass das kompliziert ist, wenn man bedenkt, dass man ja auch komplexe Objekte in die Anwendung rein und aus der Anwendung raus draggen können will. Z.B. „Drag-And-Drop einer Datei aus dem Windows-Explorer in die Anwendung, um die Datei zu öffnen“. Aber es gibt einige Tutorials und Beispiele, an denen man sich entlanghangeln kann (auch wenn das Gefühl etwas unbehaglich ist, das ganze nicht in aller Tiefe „verstanden“ zu haben…)