FileDocCategorySizeDatePackage
ColorSink.javaAPI DocExample6151Mon Oct 11 15:07:22 BST 1999None

ColorSink

public class ColorSink extends JTextArea implements DropTargetListener
This simple JTextArea subclass allows TransferableColor objects to be pasted or dropped into it. It also supports the pasting of text, and the dropping of File objects.

Fields Summary
protected static Border
dropBorder
Constructors Summary
public ColorSink()
Create a new ColorSink object

    // Listen for double clicks.  Use them to trigger a paste action.
    addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) { pastecolor(); e.consume(); }
      }
    });
    
    // We have to create a DropTarget object to support Drag-and-Drop
    // It will listen for drops on top of us, and notify our DropTargetListener
    // methods when drag-and-drop related events occur.
    setDropTarget(new DropTarget(this, this));
  
Methods Summary
public voiddragEnter(java.awt.dnd.DropTargetDragEvent e)


  // Something is being dragged over us.  If we can support this data type
  // tell the drag-and-drop system that we are interested, and display
  // a special border to tell the user that we're intereted.
      
    if (e.isDataFlavorSupported(TransferableColor.colorFlavor) ||
        e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
      this.setBorder(dropBorder);
    }
  
public voiddragExit(java.awt.dnd.DropTargetEvent e)
The user is no longer dragging over us, so restore the default border

 this.setBorder(null); 
public voiddragOver(java.awt.dnd.DropTargetDragEvent e)

public voiddrop(java.awt.dnd.DropTargetDropEvent e)
This method is invoked when the user drops something on us

    this.setBorder(null);                  // Restore the default border
    Transferable t = e.getTransferable();  // Get the data that was dropped

    // Check for types of data that we support
    if (t.isDataFlavorSupported(TransferableColor.colorFlavor)) {
      // If it was a color, accept it, and use it as the background color
      e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
      try {
        Color c = (Color) t.getTransferData(TransferableColor.colorFlavor);
        this.setBackground(c);
        e.dropComplete(true);
      }
      catch (Exception ex) { e.dropComplete(false); }
    }
    else if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      // If it was a file list, accept it, read the first file in the list
      // and display the file contents
      e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
      try {
        List files = (List) t.getTransferData(DataFlavor.javaFileListFlavor);
        File f = (File) files.get(0);
        BufferedReader in = new BufferedReader(new FileReader(f));
        String s;
        this.setText("");
        while((s = in.readLine()) != null) this.append(s);
        e.dropComplete(true);
      }
      catch (Exception ex) { e.dropComplete(false); }
    }
    else {  // If it wasn't a color or a file list, reject it.
      e.rejectDrop();
      return;
    }
  
public voiddropActionChanged(java.awt.dnd.DropTargetDragEvent e)

public static voidmain(java.lang.String[] args)
This is a simple test program for ColorSource and ColorSink

    // Create a window
    JFrame f = new JFrame("ColorSourceTest");
    f.getContentPane().setLayout(new BorderLayout());

    // Add some ColorSources
    JPanel panel = new JPanel();
    f.getContentPane().add(panel, BorderLayout.NORTH);
    panel.add(new ColorSource(Color.yellow));
    panel.add(new ColorSource(Color.pink));
    panel.add(new ColorSource(Color.white));
    panel.add(new ColorSource(Color.gray));

    // Add a ColorSink
    ColorSink sink = new ColorSink();
    f.getContentPane().add(sink, BorderLayout.CENTER);

    // Pop it all up
    f.setSize(400, 300);
    f.show();
  
public voidpastecolor()

    // Get the clipboard, and read its contents
    Clipboard c = this.getToolkit().getSystemClipboard();
    Transferable t = c.getContents(this);
    if (t == null) {             // If nothing to paste
      this.getToolkit().beep();  // then beep and do nothing
      return;
    }
    try {
      // If the clipboard contained a color, use it as the background color
      if (t.isDataFlavorSupported(TransferableColor.colorFlavor)) {
        Color color = (Color) t.getTransferData(TransferableColor.colorFlavor);
        this.setBackground(color);
      }
      // If the clipboard contained text, insert it.
      else if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
        String s = (String) t.getTransferData(DataFlavor.stringFlavor);
        this.replaceSelection(s);
      }
      // Otherwise, we don't know how to paste the data, so just beep.
      else this.getToolkit().beep();
    }
    catch (UnsupportedFlavorException ex) { this.getToolkit().beep(); }
    catch (IOException ex) { this.getToolkit().beep(); }