Java Swing How to - Create JTextArea that will accept any drop objects








Question

We would like to know how to create JTextArea that will accept any drop objects.

Answer

//  ww  w .j  a  v  a 2  s  .c o m
/*
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 UTest {

  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("");
  }

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