Java tutorial
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall */ import java.awt.Font; import java.awt.datatransfer.DataFlavor; 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.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Iterator; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.UIManager; public class JLabelDragSource implements DragGestureListener, DragSourceListener { public JLabelDragSource(JLabel label) { this.label = label; // Use the default DragSource DragSource dragSource = DragSource.getDefaultDragSource(); // Create a DragGestureRecognizer and // register as the listener dragSource.createDefaultDragGestureRecognizer(label, DnDConstants.ACTION_COPY_OR_MOVE, this); } // Implementation of DragGestureListener interface. public void dragGestureRecognized(DragGestureEvent dge) { if (DnDUtils.isDebugEnabled()) { DnDUtils.debugPrintln("Initiating event is " + dge.getTriggerEvent()); DnDUtils.debugPrintln("Complete event set is:"); Iterator iter = dge.iterator(); while (iter.hasNext()) { DnDUtils.debugPrintln("\t" + iter.next()); } } Transferable transferable = new JLabelTransferable(label); dge.startDrag(null, transferable, this); } // Implementation of DragSourceListener interface public void dragEnter(DragSourceDragEvent dsde) { DnDUtils.debugPrintln( "Drag Source: dragEnter, drop action = " + DnDUtils.showActions(dsde.getDropAction())); } public void dragOver(DragSourceDragEvent dsde) { DnDUtils.debugPrintln("Drag Source: dragOver, drop action = " + DnDUtils.showActions(dsde.getDropAction())); } public void dragExit(DragSourceEvent dse) { DnDUtils.debugPrintln("Drag Source: dragExit"); } public void dropActionChanged(DragSourceDragEvent dsde) { DnDUtils.debugPrintln( "Drag Source: dropActionChanged, drop action = " + DnDUtils.showActions(dsde.getDropAction())); } public void dragDropEnd(DragSourceDropEvent dsde) { DnDUtils.debugPrintln("Drag Source: drop completed, drop action = " + DnDUtils.showActions(dsde.getDropAction()) + ", success: " + dsde.getDropSuccess()); } public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) { } JFrame f = new JFrame("Draggable JLabel"); JLabel label = new JLabel("Drag this text", JLabel.CENTER); label.setFont(new Font("Serif", Font.BOLD, 32)); f.getContentPane().add(label); f.pack(); f.setVisible(true); // Attach the drag source JLabelDragSource dragSource = new JLabelDragSource(label); } protected JLabel label; // The associated JLabel } class DnDUtils { public static String showActions(int action) { String actions = ""; if ((action & (DnDConstants.ACTION_LINK | DnDConstants.ACTION_COPY_OR_MOVE)) == 0) { return "None"; } if ((action & DnDConstants.ACTION_COPY) != 0) { actions += "Copy "; } if ((action & DnDConstants.ACTION_MOVE) != 0) { actions += "Move "; } if ((action & DnDConstants.ACTION_LINK) != 0) { actions += "Link"; } return actions; } public static boolean isDebugEnabled() { return debugEnabled; } public static void debugPrintln(String s) { if (debugEnabled) { System.out.println(s); } } private static boolean debugEnabled = (System.getProperty("DnDExamples.debug") != null); } class JLabelTransferable implements Transferable { public JLabelTransferable(JLabel label) { this.label = label; } // Implementation of the Transferable interface public DataFlavor[] getTransferDataFlavors() { return flavors; } public boolean isDataFlavorSupported(DataFlavor fl) { for (int i = 0; i < flavors.length; i++) { if (fl.equals(flavors[i])) { return true; } } return false; } public Object getTransferData(DataFlavor fl) { if (!isDataFlavorSupported(fl)) { return null; } if (fl.equals(DataFlavor.stringFlavor)) { // String - return the text as a String return label.getText() + " (DataFlavor.stringFlavor)"; } else if (fl.equals(jLabelFlavor)) { // The JLabel itself - just return the label. return label; } else { // Plain text - return an InputStream try { String targetText = label.getText() + " (plain text flavor)"; int length = targetText.length(); ByteArrayOutputStream os = new ByteArrayOutputStream(); OutputStreamWriter w = new OutputStreamWriter(os); w.write(targetText, 0, length); w.flush(); byte[] bytes = os.toByteArray(); w.close(); return new ByteArrayInputStream(bytes); } catch (IOException e) { return null; } } } // A flavor that transfers a copy of the JLabel public static final DataFlavor jLabelFlavor = new DataFlavor(JLabel.class, "Swing JLabel"); private JLabel label; // The label being transferred private static final DataFlavor[] flavors = new DataFlavor[] { DataFlavor.stringFlavor, new DataFlavor("text/plain; charset=ascii", "ASCII text"), jLabelFlavor }; }