JLabelDragSource.java Source code

Java tutorial

Introduction

Here is the source code for JLabelDragSource.java

Source

/*
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 };
}