Drag and drop
Före 1.4
Det här är en mycket översiktlig genomgång, bara
för att visa att det finns. De inblandade klasserna finns i paketet
java.awt.dnd.
I mycket korta drag går man till väga enligt följande:
- Skaffa ett DropTarget-objekt som hanterar den komponent
där vi ska släppa det dragna objektet. Registrera en lyssnare
efter DropTargetEvent
- Skaffa en DragGestureRecognizer som reagerar när användaren
börjar dra från angivet objekt. Då anropas angiven DragGestureListener
- När användaren börjar dra anropas metoden dragGestureRecognized
i den DragGestureListener vi registrerade i punkt två. I den
metoden anropar vi startDrag() i det event vi får som inparameter.
Detta startar dragningen.
- När användaren drar in i den komponent som hanteras av
DropTarget i punkt ett anropas metoden dragEnter i
den DropTargetListener vi angav i punkt ett. Vi har då möjlighet
att neka drop genom att anropa rejectDrag() i eventet.
- När användaren släpper i den komponent som hanteras
av DropTarget i punkt ett anropas metoden drop() i den
DropTargetListener vi angav i punkt ett. Vi skaffar oss då
en Transferable som hanterar
det dragna datat genom att anropa getTransferable() på det
event vi fått som inparameter. Därefter tar vi hand om datat
på samma sätt som vi tar hand om data från ett Clipboard.
- Innan metoden drop() är slut anropar vi dropComplete(
true ) i eventet för att informera DragSource om att dragningen
är slut.
Och så ett exempel, DnDTest.java.
Från och med 1.4
Från 1.4 finns en väsentligt enklare metod att flytta data mellan
Swingkomponenter. Nackdelen är att den inte ger lika bra koll på
vad som händer.
Alla Swingkomponenter är förberedda för Drag and drop. Vissa
har dessutom redan funktionaliteten klar. Till exempel stöder textfält,
textareor och listor drag and drop av text. Det enda som behöver göras
är att anropa setDragEnabled(true) på komponenten, se
detta exempel på drag and drop mellan två textfält, TextDnD.java. För övriga Swingkomponenter
räcker det att registrera en javax.swing.TransferHandler och
en MouseListener. Till TransferHandlerns konstruktor ska
en sträng skickas som är namnet på den property som ska kunna
dras. I ColorDnD.java kan bakgrundsfärgen
dras från den övre panelen till den undre.