Diese Lösung funktioniert. Zu Beginn einige Cavets.
Ich habe die TransferHandler-API nicht verwendet. Ich mag es nicht, es ist zu restriktiv, aber das ist eine persönliche Sache (was es tut, es tut gut), also könnte das nicht Ihren Erwartungen entsprechen.
Ich habe mit BorderLayout getestet. Wenn Sie andere Layouts verwenden möchten, müssen Sie das herausfinden. Das DnD-Subsystem bietet Informationen über den Mauszeiger (beim Verschieben und Ablegen)
Was brauchen wir also:
Ein DataFlavor. Ich entschied mich, dies zu tun, weil es eine größere Einschränkung erlaubt
%Vor%A Übertragbar. Eine Art Wrapper, der die Daten (unser JPanel) mit einer Reihe von DataFlavors (in unserem Fall nur dem PanelDataFlavor) umschließt.
%Vor%Ein "DragGestureListener"
Dafür habe ich einen einfachen DragGestureHandler erstellt, der "JPanel" als zu ziehenden Inhalt verwendet. Dadurch kann der Gestenhandler selbst verwaltet werden.
%Vor%Okay, das sind die Grundlagen. Jetzt müssen wir alles miteinander verbinden ...
Also, in dem Panel, das ich ziehen möchte, habe ich hinzugefügt:
%Vor%Der Grund für die Verwendung der Add / Remove-Benachrichtigung auf diese Weise besteht darin, das System sauber zu halten. Es hilft zu verhindern, dass Ereignisse an unsere Komponente geliefert werden, wenn wir sie nicht mehr benötigen. Es bietet auch eine automatische Registrierung. Vielleicht möchten Sie Ihre eigene "setDraggable" -Methode verwenden.
Das ist die Ziehseite, jetzt für die Drop-Seite.
Zuerst brauchen wir einen DropTargetListener:
%Vor%Schließlich müssen wir das Drop-Ziel bei interessierten Parteien ... in den Containern registrieren, die den Drop unterstützen, den Sie hinzufügen möchten
%Vor%Persönlich initialisiere ich in der addNotify und entsorgen Sie in der removeNotify
%Vor%Nur eine kurze Notiz zu addNotifty, ich habe das mehrmals hintereinander angerufen. Sie sollten also überprüfen, ob Sie die Drop-Ziele bereits eingerichtet haben.
Das ist es.
Vielleicht finden Sie auch einige der folgenden von Interesse
Es wäre Verschwendung, sie nicht zu überprüfen, auch wenn sie nur aus Interesse sind.
Also, nach 4 Jahren, seit der ursprüngliche Code geschrieben wurde, scheint es einige Änderungen in der Funktionsweise der API gegeben zu haben, zumindest unter MacOS, die eine Reihe von Problemen verursachen
Dieser Code ist eine riesige Hilfe MadProgrammer. Für jeden, der diese Klassen verwenden möchte, aber den Mauszeiger über eine Schaltfläche in dem Panel ziehen möchte, das Sie ziehen, ersetzte ich einfach das erweiterte JPanel durch eines für eine JButton, die das Panel im Konstruktor übernimmt:
%Vor%Dann würden Sie das tun, wenn Sie die Schaltfläche erstellen:
%Vor%Tags und Links java swing drag-and-drop