Daten aus JTable per Drag 'n Drop in ein JLabel verpacken und auf einem JPanel platzieren

Da bin ich nicht ganz sicher - ich meinte tatsächlich, vor einigen Jahren mal das umgekehrte Problem zu haben, nämlich dass man unter Linux ein ~“beliebiges Bild” als Mauszeiger verwenden konnte, aber unter Windows nur irgendeinen 32x32-Pixel-Mist. Aber das war wirklich noch zu Windows 9x-Zeiten, heute ist das sicher alles anders. (Wobei ich mich frage: Wenn es so einfach wäre, warum würde man es nicht intern machen, und bei isDragImageSupported dann true zurückgeben?). Man kann ja mal schauen. Ich guck bei Gelegenheit nochmal, ob man mit einer GlassPane was machen kann, ohne dass es zuuu krampfig wird.

Ich habe deine DnD-Klasse nun in mein Projekt funktionstüchtig eingebaut, aber noch nicht vollständig angepasst.
Mir ist dann beim Rumspielen aufgefallen, dass ein Vorschau-Label auch dann auf dem DropPanel (hinter dem Popup) abgelegt wird, wenn man es nach dem Draggen noch im Popup (über der JTable) wieder fallen lässt.
Das ist im KSKB auch so und vielleicht in deinem Projekt-Code (JTreeTableDragAndDropExample.java) auf Github auch.
Siehst du da eine Möglichkeit, zu verhindern, dass die JTable nicht als DropTarget betrachtet wird?

Man kann das droppen abbrechen, mit einem Rechtsklick. Ansonsten könnte ich da nochmal schauen, vielleicht läßt sich das irgendwie mit dem ggf. nötigen Umbau für die “Vorschau ohne Image” kombinieren, aber da habe ich bisher noch nicht reingeschaut (gibt gerade noch ein paar andere Tasks).

Das habe ich jetzt gelöst, in dem ich in der Methode createPopup() in der Klasse Main aus dem KSKB neben der Anweisung DnD.installDragHandling(table); auch noch den Aufruf für DnD.installDropHandling(table); hinzugefügt habe.
Die installDropHandling()-Methode hat nun eine andere Signatur:
static void installDropHandling(JComponent dropComponent)
…so dass ich nun die übergebenen JComponents (JTable, JPanel etc.) in einer Abfrage unterscheiden kann. Passt die Komponente nicht, rufe ich im else-Zweig dtde.rejectDrop(); auf.
Das Ergebnis ist, dass ich innerhalb der JTable das gezogene Part-Objekt fallen lassen kann, ohne, dass es auf das DropPanel gezeichnet wird.

Das ist bei der aktuellen Lösung vielleicht die eleganteste Variante.

(Mit verschiedenen Abstufungen:

if (dropComponent instanceof JTable) reject(); // Brüchig

vs.

if (Objects.equals(dropComponent, dragSource)) reject(); // Vielleicht besser 

aber das muss man sich überlegen…

Die Frage, wie man “immer” das Vorschaubild anzeigen kann, steht ja noch im Raum. Spätestens, wenn da eine GlassPane im Spiel ist (oder ‘sein muss’) wäre das vielleicht nicht mehr so einfach…

Ja. Ich habe mal in einem anderen Projekt ein JWindow für Programmmeldungen verwendet. Das hatte ich toFront() und alwaysOnTop(true) gesetzt. Das hat unter Windows und unter Linux funktioniert. Könnte so etwas in der Art auch für das Vorschaubild funktionieren?
Dann braucht man sich nicht an der GlassPane zerreiben.

Irgendwie liegt das hier noch so unabgeschlossen rum.

Ich habe gerade kurz probiert, die Vorschau in ein Window zu packen. Das geht ansatzweise, hakt aber auch hier und da: In dem Moment, wo man das Window (an der Cursorposition) anzeigt, gilt das als “Verlassen der (ursprünglichen) Drop-Target-Component”. Das kann man umgehen, aber dann kann man auf einmal das Bauteil aus dem Fenster raus ziehen (weil der Cursor ja immer über einem (anderen) Fenster bleibt - nämlich dem, das die Vorschau enthält).

Ich würde nochmal einen Ansatz mit einer Art GlassPane probieren - im speziellen ohne Popup. “Eine Art GlassPane”, weil es tatsächlich keine GlassPane im einem JFrame wäre, sondern nur ein Panel, das über allen liegt, die mit DnD zu tun haben.

Das ist auch der Punkt, weswegen ich nachfrage: Gibt es irgendwelche absehbaren Schwierigkeiten, wenn das Popup wegfällt?

Hallo Marco, danke, dass du noch mal Zeit investiert hast und für deine Nachricht darüber.

An und für sich nicht, ich müsste dann dafür eben eine andere Lösung finden. Wohl mit einem Panel…