java swing的drag and drop源程序

原创 2001年09月26日 16:53:00

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

.NET中的Drag and Drop操作(三)

前两篇文件介绍了.NET平台下Drag and Drop操作的原理以及整个拖拽的过程,还分析了拖拽过程中的数据的格式。本篇是这个小系列的最后一篇,主要是通过列子介绍.NET程序如何与Windows S...
  • jumtre
  • jumtre
  • 2013年12月11日 13:05
  • 2879

在QML应用中如何实现drag and drop功能

在这篇文章中,我们将展示如何在QML应用中实现drag and drop的功能。更多的阅读可以参照Qt SDK。...
  • UbuntuTouch
  • UbuntuTouch
  • 2015年06月16日 14:23
  • 1863

angular拖动插件——ng-drag、ng-drop

转自:http://blog.csdn.net/zcl_love_wx/article/details/51691631 1.相关地址: 插件下载:https://github.com/f...
  • Inuyasha1121
  • Inuyasha1121
  • 2017年06月25日 13:50
  • 2906

DragDropUtil - This utility class is easy for developer to bind two awt,swing components with drag and drop actions.

  • 2009年08月23日 21:02
  • 49KB
  • 下载

java swing控件的drag和drop的实现方法

  • 2009年08月21日 18:18
  • 3KB
  • 下载

Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结

Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结   1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制.必须有Dr...
  • attilax
  • attilax
  • 2014年12月12日 23:36
  • 1234

A step-by-step description of how to drag and drop files bet

  • 2006年02月23日 09:05
  • 67KB
  • 下载

Preventing inadvertant drag and drop(3KB)

  • 2006年02月23日 09:05
  • 2KB
  • 下载

Scrolling during drag and drop(4KB)

  • 2006年02月23日 09:05
  • 3KB
  • 下载

Drag and Drop Component Suite 3.7 (拖放)

  • 2006年01月13日 09:51
  • 104KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java swing的drag and drop源程序
举报原因:
原因补充:

(最多只允许输入30个字)