Class FileDrop

java.lang.Object
it.ipzs.cieid.Firma.FileDrop

public class FileDrop extends Object
This class makes it easy to drag and drop files from the operating system to a Java program. Any java.awt.Component can be dropped onto, but only javax.swing.JComponents will indicate the drop event with a changed border.

To use this class, construct a new FileDrop by passing it the target component and a Listener to receive notification when file(s) have been dropped. Here is an example:

      JPanel myPanel = new JPanel();
      new FileDrop( myPanel, new FileDrop.Listener()
      {   public void filesDropped( java.io.File[] files )
          {   
              // handle file drop
              ...
          }   // end filesDropped
      }); // end FileDrop.Listener
 

You can specify the border that will appear when files are being dragged by calling the constructor with a javax.swing.border.Border. Only JComponents will show any indication with a border.

You can turn on some debugging features by passing a PrintStream object (such as System.out) into the full constructor. A null value will result in no extra debugging information being output.

I'm releasing this code into the Public Domain. Enjoy.

Original author: Robert Harder, rharder@usa.net

2007-09-12 Nathan Blomquist -- Linux (KDE/Gnome) support added.

Version:
1.0.1
  • Field Details

    • normalBorder

      private transient Border normalBorder
    • dropListener

      private transient DropTargetListener dropListener
    • supportsDnD

      private static Boolean supportsDnD
      Discover if the running JVM is modern enough to have drag and drop.
    • defaultBorderColor

      private static Color defaultBorderColor
    • ZERO_CHAR_STRING

      private static String ZERO_CHAR_STRING
  • Constructor Details

    • FileDrop

      public FileDrop(Component c, FileDrop.Listener listener)
      Constructs a FileDrop with a default light-blue border and, if c is a Container, recursively sets all elements contained within as drop targets, though only the top level container will change borders.
      Parameters:
      c - Component on which files will be dropped.
      listener - Listens for filesDropped.
      Since:
      1.0
    • FileDrop

      public FileDrop(Component c, boolean recursive, FileDrop.Listener listener)
      Constructor with a default border and the option to recursively set drop targets. If your component is a java.awt.Container, then each of its children components will also listen for drops, though only the parent will change borders.
      Parameters:
      c - Component on which files will be dropped.
      recursive - Recursively set children as drop targets.
      listener - Listens for filesDropped.
      Since:
      1.0
    • FileDrop

      public FileDrop(PrintStream out, Component c, FileDrop.Listener listener)
      Constructor with a default border and debugging optionally turned on. With Debugging turned on, more status messages will be displayed to out. A common way to use this constructor is with System.out or System.err. A null value for the parameter out will result in no debugging output.
      Parameters:
      out - PrintStream to record debugging info or null for no debugging.
      c - Component on which files will be dropped.
      listener - Listens for filesDropped.
      out -
      Since:
      1.0
    • FileDrop

      public FileDrop(PrintStream out, Component c, boolean recursive, FileDrop.Listener listener)
      Constructor with a default border, debugging optionally turned on and the option to recursively set drop targets. If your component is a java.awt.Container, then each of its children components will also listen for drops, though only the parent will change borders. With Debugging turned on, more status messages will be displayed to out. A common way to use this constructor is with System.out or System.err. A null value for the parameter out will result in no debugging output.
      Parameters:
      out - PrintStream to record debugging info or null for no debugging.
      c - Component on which files will be dropped.
      recursive - Recursively set children as drop targets.
      listener - Listens for filesDropped.
      out -
      Since:
      1.0
    • FileDrop

      public FileDrop(Component c, Border dragBorder, FileDrop.Listener listener)
      Constructor with a specified border
      Parameters:
      c - Component on which files will be dropped.
      dragBorder - Border to use on JComponent when dragging occurs.
      listener - Listens for filesDropped.
      Since:
      1.0
    • FileDrop

      public FileDrop(Component c, Border dragBorder, boolean recursive, FileDrop.Listener listener)
      Constructor with a specified border and the option to recursively set drop targets. If your component is a java.awt.Container, then each of its children components will also listen for drops, though only the parent will change borders.
      Parameters:
      c - Component on which files will be dropped.
      dragBorder - Border to use on JComponent when dragging occurs.
      recursive - Recursively set children as drop targets.
      listener - Listens for filesDropped.
      Since:
      1.0
    • FileDrop

      public FileDrop(PrintStream out, Component c, Border dragBorder, FileDrop.Listener listener)
      Constructor with a specified border and debugging optionally turned on. With Debugging turned on, more status messages will be displayed to out. A common way to use this constructor is with System.out or System.err. A null value for the parameter out will result in no debugging output.
      Parameters:
      out - PrintStream to record debugging info or null for no debugging.
      c - Component on which files will be dropped.
      dragBorder - Border to use on JComponent when dragging occurs.
      listener - Listens for filesDropped.
      Since:
      1.0
    • FileDrop

      public FileDrop(PrintStream out, Component c, Border dragBorder, boolean recursive, FileDrop.Listener listener)
      Full constructor with a specified border and debugging optionally turned on. With Debugging turned on, more status messages will be displayed to out. A common way to use this constructor is with System.out or System.err. A null value for the parameter out will result in no debugging output.
      Parameters:
      out - PrintStream to record debugging info or null for no debugging.
      c - Component on which files will be dropped.
      dragBorder - Border to use on JComponent when dragging occurs.
      recursive - Recursively set children as drop targets.
      listener - Listens for filesDropped.
      Since:
      1.0
  • Method Details

    • supportsDnD

      private static boolean supportsDnD()
    • createFileArray

      private static File[] createFileArray(BufferedReader bReader, PrintStream out)
    • makeDropTarget

      private void makeDropTarget(PrintStream out, Component c, boolean recursive)
    • isDragOk

      private boolean isDragOk(PrintStream out, DropTargetDragEvent evt)
      Determine if the dragged data is a file list.
    • log

      private static void log(PrintStream out, String message)
      Outputs message to out if it's not null.
    • remove

      public static boolean remove(Component c)
      Removes the drag-and-drop hooks from the component and optionally from the all children. You should call this if you add and remove components after you've set up the drag-and-drop. This will recursively unregister all components contained within c if c is a Container.
      Parameters:
      c - The component to unregister as a drop target
      Since:
      1.0
    • remove

      public static boolean remove(PrintStream out, Component c, boolean recursive)
      Removes the drag-and-drop hooks from the component and optionally from the all children. You should call this if you add and remove components after you've set up the drag-and-drop.
      Parameters:
      out - Optional PrintStream for logging drag and drop messages
      c - The component to unregister
      recursive - Recursively unregister components within a container
      Since:
      1.0