Mega Code Archive

 
Categories / Java / Swing JFC
 

Color Drag Source

/*  * This example is from the book "Java Foundation Classes in a Nutshell".  * Written by David Flanagan. Copyright (c) 1999 by O'Reilly & Associates.    * You may distribute this source code for non-commercial purposes only.  * You may study, modify, and use this example for any purpose, as long as  * this notice is retained.  Note that this example is provided "as is",  * WITHOUT WARRANTY of any kind either expressed or implied.  */ import java.awt.*; import java.awt.event.*; import java.awt.datatransfer.*; import java.awt.dnd.*; import javax.swing.*; import javax.swing.border.*; import java.io.*; /**  * This simple component displays a solid color, and allows that color  * to be dragged. Also, it copies the color to the clipboard when the   * user clicks on it.  */ public class ColorSource extends JComponent        implements ClipboardOwner, DragGestureListener, DragSourceListener {   Color color;                // The color to display   TransferableColor tcolor;   // The color, encapsulated for data transfer   DragSource dragSource;      // We need this object for drag-and-drop   /** A ColorSource normally displays itself with this border */   protected static Border defaultBorder = new BevelBorder(BevelBorder.LOWERED);   /** When we are the clipboard owner, uses this border */   protected static Border highlightBorder =      new CompoundBorder(defaultBorder, new LineBorder(Color.black, 2));   /** Create a new ColorSource object that displays the speciifed color */   public ColorSource(Color color) {     // Save the color.  Encapsulate it in a Transferable object so that     // it can be used with cut-and-paste and drag-and-drop     this.color = color;     this.tcolor = new TransferableColor(color);     // Set our default border     this.setBorder(defaultBorder);     // Listen for mouse clicks, and copy the color to the clipboard.     this.addMouseListener(new MouseAdapter() {       public void mouseClicked(MouseEvent e) { copy(); }     });     // Set up a DragGestureRecognizer that will detect when the user      // begins a drag.  When it detects one, it will notify us by calling     // the dragGestureRecognized() method of the DragGestureListener     // interface we implement below     this.dragSource = DragSource.getDefaultDragSource();     dragSource.createDefaultDragGestureRecognizer(this, // Look for drags on us                   DnDConstants.ACTION_COPY_OR_MOVE,  // Recognize these types                   this);                             // Tell us when recognized   }   // These are component methods that make this class work as a component.   // They specify how big the component is, and what it it looks like.   protected static Dimension mysize = new Dimension(25, 25);   public Dimension getMinimumSize() { return mysize; }   public Dimension getPreferredSize() { return mysize; }   public void paintComponent(Graphics g) {     g.setColor(color);     Dimension s = this.getSize();     Insets i = this.getInsets();     g.fillRect(i.left, i.top,                 s.width-i.left-i.right, s.height-i.top-i.bottom);   }   // The methods below support cut-and-paste   /** This method copies the color to the clipboard. */   public void copy() {     // Get system clipboard     Clipboard c = this.getToolkit().getSystemClipboard();     // Put our TransferableColor object on the clipboard.     // Also, we'll get notification when we no longer own the clipboard     c.setContents(tcolor, this);     // Set a special border on ourselves that indicates that we're the     // current color available for pasting.     this.setBorder(highlightBorder);   }   // This ClipboardOwner method is called when something else is   // placed on the clipboard.  It means that our color is no longer   // available for pasting, and we should not display the highlight border   public void lostOwnership(Clipboard clipboard, Transferable contents) {     this.setBorder(defaultBorder);   }   // The methods below support drag-and-drop   // This DragGestureListener method is called when the DragGestureRecognizer   // detects that the user has dragged the mouse.  It is responsible   // for beginning the drag-and-drop process.   public void dragGestureRecognized(DragGestureEvent e) {     // Create an image we can drag along with us.     // Not all systems support this, but it doesn't hurt to try.     Image colorblock = this.createImage(25,25);     Graphics g = colorblock.getGraphics();     g.setColor(color);     g.fillRect(0,0,25,25);     // Start dragging our transferable color object.     e.startDrag(DragSource.DefaultMoveDrop,    // The initial drag cursor                 colorblock, new Point(0,0),    // The image to drag                 tcolor,                        // The data being dragged                 this);                         // Who to notify during drag   }   // These methods implement DragSourceListener.   // Since we passed this object to startDrag, these methods will be   // called at interesting points during the drag.  We could use them,   // for example to implement custom cursors or other "drag over" effects   public void dragEnter(DragSourceDragEvent e) {}   public void dragExit(DragSourceEvent e) {}   public void dragDropEnd(DragSourceDropEvent e) {}   public void dragOver(DragSourceDragEvent e) {}   public void dropActionChanged(DragSourceDragEvent e) {} }