Mega Code Archive

 
Categories / Java / Swing JFC
 

JLabel Drag 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 }; }