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.*; import java.util.List; /** * 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. */ public class ColorSink extends JTextArea implements DropTargetListener { /** Create a new ColorSink object */ public ColorSink() { // 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)); } // This method is invoked when the user double-clicks on us. It attempts // to paste a color or text. Note that the JTextArea we extend // already supports cut-and-paste of text through the Ctrl-V keystroke. // This adds a different kind of cut-and-paste for demonstration purposes. public void pastecolor() { // 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(); } } // The methods below are the methods of DropTargetListener. // They are invoked at various times when something is being // dragged over us, and allow us an opportunity to respond to the drag // This is the border we display when the user is dragging over us. protected static Border dropBorder = new BevelBorder(BevelBorder.LOWERED); // 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. public void dragEnter(DropTargetDragEvent e) { if (e.isDataFlavorSupported(TransferableColor.colorFlavor) || e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); this.setBorder(dropBorder); } } /** The user is no longer dragging over us, so restore the default border */ public void dragExit(DropTargetEvent e) { this.setBorder(null); } /** This method is invoked when the user drops something on us */ public void drop(DropTargetDropEvent e) { 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; } } // These are unused DropTargetListener methods public void dragOver(DropTargetDragEvent e) { } public void dropActionChanged(DropTargetDragEvent e) { } /** This is a simple test program for ColorSource and ColorSink */ public static void main(String[] args) { // 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(); } }