Create a TransferHandler and JTextArea that will accept drop in Java

Description

The following code shows how to create a TransferHandler and JTextArea that will accept drop.

Example


//from   w  w  w  .  j a va2  s. c om


 
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly 
*/
// UTest.java
//A test frame work for the UberHandler drop handler. This version has
//no fancy Unicode characters for ease of use. (Note that "ease of use"
//only applys to humans...the Java tools are quite happy with Unicode
//characters. Not all text editors are, though...)
//

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.BufferedReader;
import java.io.Reader;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.TransferHandler;

public class Main {

  public static void main(String args[]) {
    JFrame frame = new JFrame("Debugging Drop Zone");
    frame.setSize(500, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextArea jta = new JTextArea();
    frame.getContentPane().add(new JScrollPane(jta));
    UberHandler uh = new UberHandler();
    uh.setOutput(jta);
    jta.setTransferHandler(uh);

    frame.setVisible(true);
  }
}

//UberHandler.java
//A TransferHandler that will accept any drop at all. If a text area is
//registered, debugging information will be sent there. Otherwise, all
//debug information will be sent to stdout.
//

class UberHandler extends TransferHandler {
  JTextArea output;

  public void TransferHandler() {
  }

  public boolean canImport(JComponent dest, DataFlavor[] flavors) {
    // you bet we can!
    return true;
  }

  public boolean importData(JComponent src, Transferable transferable) {
    // Ok, here's the tricky part...
    println("Receiving data from " + src);
    println("Transferable object is: " + transferable);
    println("Valid data flavors: ");
    DataFlavor[] flavors = transferable.getTransferDataFlavors();
    DataFlavor listFlavor = null;
    DataFlavor objectFlavor = null;
    DataFlavor readerFlavor = null;
    int lastFlavor = flavors.length - 1;

    // Check the flavors and see if we find one we like.
    // If we do, save it.
    for (int f = 0; f <= lastFlavor; f++) {
      println("  " + flavors[f]);
      if (flavors[f].isFlavorJavaFileListType()) {
        listFlavor = flavors[f];
      }
      if (flavors[f].isFlavorSerializedObjectType()) {
        objectFlavor = flavors[f];
      }
      if (flavors[f].isRepresentationClassReader()) {
        readerFlavor = flavors[f];
      }
    }

    // Ok, now try to display the content of the drop.
    try {
      DataFlavor bestTextFlavor = DataFlavor
          .selectBestTextFlavor(flavors);
      BufferedReader br = null;
      String line = null;
      if (bestTextFlavor != null) {
        println("Best text flavor: " + bestTextFlavor.getMimeType());
        println("Content:");
        Reader r = bestTextFlavor.getReaderForText(transferable);
        br = new BufferedReader(r);
        line = br.readLine();
        while (line != null) {
          println(line);
          line = br.readLine();
        }
        br.close();
      } else if (listFlavor != null) {
        java.util.List list = (java.util.List) transferable
            .getTransferData(listFlavor);
        println(list);
      } else if (objectFlavor != null) {
        println("Data is a java object:\n"
            + transferable.getTransferData(objectFlavor));
      } else if (readerFlavor != null) {
        println("Data is an InputStream:");
        br = new BufferedReader((Reader) transferable
            .getTransferData(readerFlavor));
        line = br.readLine();
        while (line != null) {
          println(line);
        }
        br.close();
      } else {
        // Don't know this flavor type yet...
        println("No text representation to show.");
      }
      println("\n\n");
    } catch (Exception e) {
      println("Caught exception decoding transfer:");
      println(e);
      return false;
    }
    return true;
  }

  public void exportDone(JComponent source, Transferable data, int action) {
    // Just let us know when it occurs...
    System.err.println("Export Done.");
  }

  public void setOutput(JTextArea jta) {
    output = jta;
  }

  protected void print(Object o) {
    print(o.toString());
  }

  protected void print(String s) {
    if (output != null) {
      output.append(s);
    } else {
      System.out.println(s);
    }
  }

  protected void println(Object o) {
    println(o.toString());
  }

  protected void println(String s) {
    if (output != null) {
      output.append(s);
      output.append("\n");
    } else {
      System.out.println(s);
    }
  }

  protected void println() {
    println("");
  }

}

The code above generates the following result.

Create a TransferHandler and JTextArea that will accept drop in Java




















Home »
  Java Tutorial »
    Swing »




Action
Border
Color Chooser
Drag and Drop
Event
Font Chooser
JButton
JCheckBox
JComboBox
JDialog
JEditorPane
JFileChooser
JFormattedText
JFrame
JLabel
JList
JOptionPane
JPasswordField
JProgressBar
JRadioButton
JScrollBar
JScrollPane
JSeparator
JSlider
JSpinner
JSplitPane
JTabbedPane
JTable
JTextArea
JTextField
JTextPane
JToggleButton
JToolTip
JTree
Layout
Menu
Timer