Java tutorial
/* * 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) { } }