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:

  1. Skaffa ett DropTarget-objekt som hanterar den komponent där vi ska släppa det dragna objektet. Registrera en lyssnare efter DropTargetEvent
  2. Skaffa en DragGestureRecognizer som reagerar när användaren börjar dra från angivet objekt. Då anropas angiven DragGestureListener
  3. 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.
  4. 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.
  5. 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.
  6. 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.