ColorSource.java Source code

Java tutorial

Introduction

Here is the source code for ColorSource.java

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) {
    }
}