Click here to Skip to main content
15,867,704 members
Articles / Programming Languages / Java / Java SE
Article

Drag And Drop between JList and Windows Explorer

Rate me:
Please Sign up or sign in to vote.
3.21/5 (11 votes)
1 Jul 2000 219.1K   355   22   30
Pure Java Sample for Drag and Drop between Swing based JList and Windows Explorer
  • Download source files - 150 Kb

    Sample Image - image1.gif

    Introduction

    Until JDK1.2.2, It was not possible to Drag and Drop a file from Windows Explorer to a Java based Swing/AWT component. Here is some sample code that will show you how to Drag and Drop from a JList control. The code can be very easily used with other components like JTree and JTable.

    To compile the code use "javac ListDemo.java". To run it use "java ListDemo"

    import java.awt.*;
    import java.io.*;
    import java.util.*;
    import java.awt.event.*;
    import java.awt.dnd.*;
    import java.awt.datatransfer.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;
    
    public class ListDemo extends JFrame
                          implements ListSelectionListener
    {
        private DroppableList list;
        private JTextField fileName;
    
        public ListDemo()
        {
            super("ListDemo");
    
            //Create the list and put it in a scroll pane
            list = new DroppableList();
            DefaultListModel listModel = (DefaultListModel)list.getModel();
            list.setCellRenderer(new CustomCellRenderer());
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.setSelectedIndex(0);
            list.addListSelectionListener(this);
            JScrollPane listScrollPane = new JScrollPane(list);
    
            String dirName = new String("\\");
            String filelist[] = new File(dirName).list();
            for (int i=0; i < filelist.length ; i++ )
            {
                String thisFileSt = dirName+filelist[i];
                File thisFile = new File(thisFileSt);
                if (thisFile.isDirectory())
                    continue;
                try {
                    listModel.addElement(makeNode(thisFile.getName(),
                                                  thisFile.toURL().toString(),
                                                  thisFile.getAbsolutePath()));
                } catch (java.net.MalformedURLException e){
                }
            }
    
            fileName = new JTextField(50);
            String name = listModel.getElementAt(
                                  list.getSelectedIndex()).toString();
            fileName.setText(name);
    
            //Create a panel that uses FlowLayout (the default).
            JPanel buttonPane = new JPanel();
            buttonPane.add(fileName);
    
            Container contentPane = getContentPane();
            contentPane.add(listScrollPane, BorderLayout.CENTER);
            contentPane.add(buttonPane, BorderLayout.NORTH);
        }
    
        public void valueChanged(ListSelectionEvent e)
        {
            if (e.getValueIsAdjusting() == false)
            {
                fileName.setText("");
                if (list.getSelectedIndex() != -1)
                {
                    String name = list.getSelectedValue().toString();
                    fileName.setText(name);
                }
            }
        }
    
        private static Hashtable makeNode(String name,
            String url, String strPath)
        {
            Hashtable hashtable = new Hashtable();
            hashtable.put("name", name);
            hashtable.put("url", url);
            hashtable.put("path", strPath);
            return hashtable;
        }
    
        public class DroppableList extends JList
            implements DropTargetListener, DragSourceListener, DragGestureListener
        {
            DropTarget dropTarget = new DropTarget (this, this);
            DragSource dragSource = DragSource.getDefaultDragSource();
    
            public DroppableList()
            {
              dragSource.createDefaultDragGestureRecognizer(
                  this, DnDConstants.ACTION_COPY_OR_MOVE, this);
              setModel(new DefaultListModel());
            }
    
            public void dragDropEnd(DragSourceDropEvent DragSourceDropEvent){}
            public void dragEnter(DragSourceDragEvent DragSourceDragEvent){}
            public void dragExit(DragSourceEvent DragSourceEvent){}
            public void dragOver(DragSourceDragEvent DragSourceDragEvent){}
            public void dropActionChanged(DragSourceDragEvent DragSourceDragEvent){}
    
            public void dragEnter (DropTargetDragEvent dropTargetDragEvent)
            {
              dropTargetDragEvent.acceptDrag (DnDConstants.ACTION_COPY_OR_MOVE);
            }
    
            public void dragExit (DropTargetEvent dropTargetEvent) {}
            public void dragOver (DropTargetDragEvent dropTargetDragEvent) {}
            public void dropActionChanged (DropTargetDragEvent dropTargetDragEvent){}
    
            public synchronized void drop (DropTargetDropEvent dropTargetDropEvent)
            {
                try
                {
                    Transferable tr = dropTargetDropEvent.getTransferable();
                    if (tr.isDataFlavorSupported (DataFlavor.javaFileListFlavor))
                    {
                        dropTargetDropEvent.acceptDrop (
                            DnDConstants.ACTION_COPY_OR_MOVE);
                        java.util.List fileList = (java.util.List)
                            tr.getTransferData(DataFlavor.javaFileListFlavor);
                        Iterator iterator = fileList.iterator();
                        while (iterator.hasNext())
                        {
                          File file = (File)iterator.next();
                          Hashtable hashtable = new Hashtable();
                          hashtable.put("name",file.getName());
                          hashtable.put("url",file.toURL().toString());
                          hashtable.put("path",file.getAbsolutePath());
                          ((DefaultListModel)getModel()).addElement(hashtable);
                        }
                        dropTargetDropEvent.getDropTargetContext().dropComplete(true);
                  } else {
                    System.err.println ("Rejected");
                    dropTargetDropEvent.rejectDrop();
                  }
                } catch (IOException io) {
                    io.printStackTrace();
                    dropTargetDropEvent.rejectDrop();
                } catch (UnsupportedFlavorException ufe) {
                    ufe.printStackTrace();
                    dropTargetDropEvent.rejectDrop();
                }
            }
    
            public void dragGestureRecognized(DragGestureEvent dragGestureEvent)
            {
                if (getSelectedIndex() == -1)
                    return;
                Object obj = getSelectedValue();
                if (obj == null) {
                    // Nothing selected, nothing to drag
                    System.out.println ("Nothing selected - beep");
                    getToolkit().beep();
                } else {
                    Hashtable table = (Hashtable)obj;
                    FileSelection transferable =
                      new FileSelection(new File((String)table.get("path")));
                    dragGestureEvent.startDrag(
                      DragSource.DefaultCopyDrop,
                      transferable,
                      this);
                }
            }
        }
    
        public class CustomCellRenderer implements ListCellRenderer
        {
            DefaultListCellRenderer listCellRenderer =
              new DefaultListCellRenderer();
            public Component getListCellRendererComponent(
                JList list, Object value, int index,
                boolean selected, boolean hasFocus)
            {
                listCellRenderer.getListCellRendererComponent(
                  list, value, index, selected, hasFocus);
                listCellRenderer.setText(getValueString(value));
                return listCellRenderer;
            }
            private String getValueString(Object value)
            {
                String returnString = "null";
                if (value != null) {
                  if (value instanceof Hashtable) {
                    Hashtable h = (Hashtable)value;
                    String name = (String)h.get("name");
                    String url = (String)h.get("url");
                    returnString = name + " ==> " + url;
                  } else {
                    returnString = "X: " + value.toString();
                  }
                }
                return returnString;
            }
        }
    
        public class FileSelection extends Vector implements Transferable
        {
            final static int FILE = 0;
            final static int STRING = 1;
            final static int PLAIN = 2;
            DataFlavor flavors[] = {DataFlavor.javaFileListFlavor,
                                    DataFlavor.stringFlavor,
                                    DataFlavor.plainTextFlavor};
            public FileSelection(File file)
            {
                addElement(file);
            }
            /* Returns the array of flavors in which it can provide the data. */
            public synchronized DataFlavor[] getTransferDataFlavors() {
        	return flavors;
            }
            /* Returns whether the requested flavor is supported by this object. */
            public boolean isDataFlavorSupported(DataFlavor flavor) {
                boolean b  = false;
                b |=flavor.equals(flavors[FILE]);
                b |= flavor.equals(flavors[STRING]);
                b |= flavor.equals(flavors[PLAIN]);
            	return (b);
            }
            /**
             * If the data was requested in the "java.lang.String" flavor,
             * return the String representing the selection.
             */
            public synchronized Object getTransferData(DataFlavor flavor)
        			throws UnsupportedFlavorException, IOException {
        	if (flavor.equals(flavors[FILE])) {
        	    return this;
        	} else if (flavor.equals(flavors[PLAIN])) {
        	    return new StringReader(((File)elementAt(0)).getAbsolutePath());
        	} else if (flavor.equals(flavors[STRING])) {
        	    return((File)elementAt(0)).getAbsolutePath();
        	} else {
        	    throw new UnsupportedFlavorException(flavor);
        	}
            }
        }
    
        public static void main(String s[])
        {
            JFrame frame = new ListDemo();
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            frame.pack();
            frame.setVisible(true);
        }
    }
  • License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here


    Written By
    United States United States
    This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

    Comments and Discussions

     
    GeneralDrag and drop items between two listboxes in asp.net with c# Pin
    Kuricheti24-Aug-06 18:42
    Kuricheti24-Aug-06 18:42 
    GeneralVery Nice Pin
    HaiJava27-Sep-05 0:28
    HaiJava27-Sep-05 0:28 
    GeneralDnDException Pin
    Anonymous8-Jun-05 1:00
    Anonymous8-Jun-05 1:00 
    GeneralNullPointerException Pin
    share_dropbin-codeproject7-Apr-05 14:29
    share_dropbin-codeproject7-Apr-05 14:29 
    Notice the problem below. Btw, this was run on WinXP using Cygwin.
    ==================================================================

    $ which javac
    /cygdrive/c/j2sdk1.4.2_08/bin/javac


    $ javac ListDemo.java
    Note: ListDemo.java uses or overrides a deprecated API.
    Note: Recompile with -deprecation for details.


    $ javac -deprecation ListDemo.java
    ListDemo.java:204: warning: plainTextFlavor in java.awt.datatransfer.DataFlavor has been deprecated
    DataFlavor.plainTextFlavor};
    ^
    1 warning


    $ java ListDemo
    Exception in thread "main" java.lang.NullPointerException
    at ListDemo.valueChanged(ListDemo.java:64)
    at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
    at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.insertIndexInterval(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI$ListDataHandler.intervalAdded(Unknown Source)
    at javax.swing.AbstractListModel.fireIntervalAdded(Unknown Source)
    at javax.swing.DefaultListModel.addElement(Unknown Source)
    at ListDemo.<init>(ListDemo.java:39)
    at ListDemo.main(ListDemo.java:241)
    GeneralRe: NullPointerException Pin
    share_dropbin-codeproject7-Apr-05 14:44
    share_dropbin-codeproject7-Apr-05 14:44 
    GeneralThank You Pin
    Dan Updike5-Mar-05 7:09
    sussDan Updike5-Mar-05 7:09 
    QuestionWhat about dropping to Explorer Pin
    Anonymous28-Oct-04 22:18
    Anonymous28-Oct-04 22:18 
    AnswerRe: What about dropping to Explorer Pin
    Anonymous18-Jul-05 1:52
    Anonymous18-Jul-05 1:52 
    QuestionException?? Pin
    Maggon Sameer7-Feb-04 17:43
    Maggon Sameer7-Feb-04 17:43 
    AnswerRe: Exception?? Pin
    Anonymous10-Mar-04 22:54
    Anonymous10-Mar-04 22:54 
    GeneralRe: Exception?? Pin
    Anonymous25-Mar-04 22:39
    Anonymous25-Mar-04 22:39 
    GeneralRe: Exception?? Pin
    superbeppe28-Apr-04 7:55
    superbeppe28-Apr-04 7:55 
    GeneralRe: Exception?? with java 1.5 Pin
    chenid09-Aug-04 10:30
    chenid09-Aug-04 10:30 
    GeneralRe: Exception?? with java 1.5 Pin
    Sinai7-Oct-04 21:18
    Sinai7-Oct-04 21:18 
    GeneralRe: Exception?? with java 1.5 Pin
    chenid08-Oct-04 5:49
    chenid08-Oct-04 5:49 
    Generaljava projects Pin
    Anonymous22-Dec-03 22:41
    Anonymous22-Dec-03 22:41 
    GeneralVery nice.. Pin
    Imran Ebrahim11-Jul-03 12:26
    Imran Ebrahim11-Jul-03 12:26 
    GeneralWell done bud Pin
    Barry Sahu8-Jul-03 20:55
    Barry Sahu8-Jul-03 20:55 
    GeneralWell Done Pin
    consijp26-Apr-03 4:26
    consijp26-Apr-03 4:26 
    GeneralReal Cool Pin
    starlight_beta11-Dec-02 0:46
    starlight_beta11-Dec-02 0:46 
    GeneralNull pointer Exception Pin
    rmedina24-Oct-02 3:01
    rmedina24-Oct-02 3:01 
    GeneralRe: Null pointer Exception Pin
    consijp26-Apr-03 4:24
    consijp26-Apr-03 4:24 
    GeneralRe: Null pointer Exception Pin
    houlingang10-Jul-03 17:11
    houlingang10-Jul-03 17:11 
    GeneralRe: Null pointer Exception Pin
    Imran Ebrahim11-Jul-03 12:24
    Imran Ebrahim11-Jul-03 12:24 
    GeneralDrag and Drop between JList and Windows Explorer Pin
    2-May-02 23:13
    suss2-May-02 23:13 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.