DND Drag and drop List : Drag Drop « Swing « Java Tutorial






/**
 * This is an example of a component, which serves as a DragSource as 
 * well as Drop Target.
 * To illustrate the concept, JList has been used as a droppable target
 * and a draggable source.
 * Any component can be used instead of a JList.
 * The code also contains debugging messages which can be used for 
 * diagnostics and understanding the flow of events.
 * 
 * @version 1.0
 */

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;

import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.ListModel;


public class DNDList extends JList implements DropTargetListener, DragSourceListener, DragGestureListener
{

  /**
   * enables this component to be a dropTarget
   */

  DropTarget dropTarget = null;

  /**
   * enables this component to be a Drag Source
   */
  DragSource dragSource = null;

  /**
   * constructor - initializes the DropTarget and DragSource.
   */

  public DNDList( ListModel dataModel )
  {
    super( dataModel );
    dropTarget = new DropTarget( this, this );
    dragSource = new DragSource();
    dragSource.createDefaultDragGestureRecognizer( this, DnDConstants.ACTION_MOVE, this );
  }

  /**
   * is invoked when you are dragging over the DropSite
   * 
   */

  public void dragEnter( DropTargetDragEvent event )
  {

    // debug messages for diagnostics
    System.out.println( "dragEnter" );
    event.acceptDrag( DnDConstants.ACTION_MOVE );
  }

  /**
   * is invoked when you are exit the DropSite without dropping
   * 
   */

  public void dragExit( DropTargetEvent event )
  {
    System.out.println( "dragExit" );

  }

  /**
   * is invoked when a drag operation is going on
   * 
   */

  public void dragOver( DropTargetDragEvent event )
  {
    System.out.println( "dragOver" );
  }

  /**
   * a drop has occurred
   * 
   */

  public void drop( DropTargetDropEvent event )
  {

    try
    {
      Transferable transferable = event.getTransferable();

      // we accept only Strings
      if( transferable.isDataFlavorSupported( DataFlavor.stringFlavor ) )
      {

        event.acceptDrop( DnDConstants.ACTION_MOVE );
        String s = ( String )transferable.getTransferData( DataFlavor.stringFlavor );
        addElement( s );
        event.getDropTargetContext().dropComplete( true );
      }
      else
      {
        event.rejectDrop();
      }
    }
    catch( Exception exception )
    {
      System.err.println( "Exception" + exception.getMessage() );
      event.rejectDrop();
    }
  }

  /**
   * is invoked if the use modifies the current drop gesture
   * 
   */

  public void dropActionChanged( DropTargetDragEvent event )
  {
  }

  /**
   * a drag gesture has been initiated
   * 
   */

  public void dragGestureRecognized( DragGestureEvent event )
  {

    Object selected = getSelectedValue();
    if( selected != null )
    {
      StringSelection text = new StringSelection( selected.toString() );

      // as the name suggests, starts the dragging
      dragSource.startDrag( event, DragSource.DefaultMoveDrop, text, this );
    }
    else
    {
      System.out.println( "nothing was selected" );
    }
  }

  /**
   * this message goes to DragSourceListener, informing it that the dragging
   * has ended
   * 
   */

  public void dragDropEnd( DragSourceDropEvent event )
  {
    if( event.getDropSuccess() )
    {
      removeElement();
    }
  }

  /**
   * this message goes to DragSourceListener, informing it that the dragging
   * has entered the DropSite
   * 
   */

  public void dragEnter( DragSourceDragEvent event )
  {
    System.out.println( " dragEnter" );
  }

  /**
   * this message goes to DragSourceListener, informing it that the dragging
   * has exited the DropSite
   * 
   */

  public void dragExit( DragSourceEvent event )
  {
    System.out.println( "dragExit" );

  }

  /**
   * this message goes to DragSourceListener, informing it that the dragging is
   * currently ocurring over the DropSite
   * 
   */

  public void dragOver( DragSourceDragEvent event )
  {
    System.out.println( "dragExit" );

  }

  /**
   * is invoked when the user changes the dropAction
   * 
   */

  public void dropActionChanged( DragSourceDragEvent event )
  {
    System.out.println( "dropActionChanged" );
  }

  /**
   * adds elements to itself
   * 
   */

  public void addElement( Object s )
  {
    ( ( DefaultListModel )getModel() ).addElement( s.toString() );
  }

  /**
   * removes an element from itself
   */

  public void removeElement()
  {
    ( ( DefaultListModel )getModel() ).removeElement( getSelectedValue() );
  }

}








14.112.Drag Drop
14.112.1.Basic drag and drop
14.112.2.Dragging Text from a JLabelDragging Text from a JLabel
14.112.3.Drag-and-Drop Support for ImagesDrag-and-Drop Support for Images
14.112.4.Drag and drop icons: use an icon property.
14.112.5.implements DragGestureListener, Transferable
14.112.6.Dragging and dropping text between a text area, a list, and a tableDragging and dropping text between a text area, a list, and a table
14.112.7.Drag and drop between JTextArea and JTextField
14.112.8.Transfer both Text and Color between JTextField and JTextArea
14.112.9.Drag and drop between JList and JTextField
14.112.10.DropMode.ON
14.112.11.DropMode.INSERT
14.112.12.DropMode.ON_OR_INSERT
14.112.13.Set tree DropMode to DropMode.USE_SELECTION
14.112.14.Set tree drag mode to DropMode.ON
14.112.15.Set tree drag mode to DropMode.INSERT
14.112.16.Set tree drag mode to DropMode.ON_OR_INSERT
14.112.17.Choose Drop Action
14.112.18.Various drop actions
14.112.19.JTable drag and drop
14.112.20.Create a drag source a drop target and a transferable object.
14.112.21.Making a Component Draggable
14.112.22.Detect a drag initiating gesture in your application
14.112.23.Illustrates cut, copy, paste and drag and drop using three instances of JList
14.112.24.Location sensitive drag and drop
14.112.25.Demonstration of the top-level TransferHandler support on JFrame
14.112.26.Drag-and-Drop customization: drag the foreground color from the first label and drop it as the background color into the second one
14.112.27.Demonstrates how to add copy and drag support to a Swing component with TransferHandler
14.112.28.ScribblePane allows individual PolyLine lines to be selected, cut, copied, pasted, dragged, and dropped
14.112.29.Built-in drag and drop support: utilize a TransferHandler class
14.112.30.DND Drag and drop List