java swing的drag and drop源程序

    技术2022-05-11  112

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

            file://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);    }}


    最新回复(0)