比如我用java写了一个文件列表,将该文件列表中某个文件拖拽到本地系统桌面,该如何实现?
当然这个文件列表也许是服务器上某个文件夹中的文件列表,拖拽发生时,将服务器上的文件拷贝到本地。
现在存在的一个问题是,从jvm也就是java开发的一个程序中拖拽到本地目录,java是否能捕获这个事件进行操作?是否可以获取到拖拽操作释放时,本地目录?

解决方案 »

  1.   

    可以实现啊,你去看下Extjs里面的部分代码,它有拖拽功能来着,只要监听点击和释放,然后根据选中的目录去读写文件就是。
      

  2.   

    你可以看看 O'Reilly Swing Hacks这本书的第九章
      

  3.   

    创建一个类继承TransferHandler如果要drop,必须实现importData,canImport方法,如果是drag,实现getSourceActions,createTransferable,exportDone,调用JList的setTransferHandler设置为上述的继承类,以下是源码,服务器的文件没试过。package dnd;import java.awt.BorderLayout;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.Transferable;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.DefaultListModel;
    import javax.swing.DropMode;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.TransferHandler;public class FileListDropTransferHandler extends TransferHandler { /**
     * drop进行数据加载
     */
    @Override
    public boolean importData(TransferSupport support) {
    if (!canImport(support)) {
    return false;
    } JList fileList = (JList) support.getComponent();
    DefaultListModel listModel = (DefaultListModel) fileList.getModel();
    List<File> transferData = null;
    try {
    Transferable transferable = support.getTransferable();
    transferData = (List<File>) transferable
    .getTransferData(DataFlavor.javaFileListFlavor);
    } catch (UnsupportedFlavorException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    if (support.isDrop()) {
    for (File file : transferData) {
    JList.DropLocation dropLocation = (javax.swing.JList.DropLocation) support
    .getDropLocation();
    int index = dropLocation.getIndex();
    if (dropLocation.isInsert()) {
    listModel.add(index, file);
    } else {
    listModel.set(index, file);
    }
    }
    } else {
    int i = 0;
    for (File file : transferData) {
    int selectedIndex = fileList.getSelectedIndex();
    if (selectedIndex >= 0) {
    i++;
    listModel.add(selectedIndex + i, file);
    } else {
    listModel.addElement(file);
    }
    }
    } return true;
    } /**
     * drop只接收文件数据
     */
    @Override
    public boolean canImport(TransferSupport support) {
    if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
    return false;
    }
    return true;
    } /**
     * 设置drag方式是复制还是剪切
     */
    @Override
    public int getSourceActions(JComponent c) {
    return COPY_OR_MOVE;
    } /**
     * 打包数据
     */
    @Override
    protected Transferable createTransferable(JComponent c) {
    JList list = (JList) c;
    List<File> files = new ArrayList<File>();
    Object[] selectedValues = list.getSelectedValues();
    Object value = list.getSelectedValue(); for (Object object : selectedValues) {
    files.add((File) object);
    }
    return new FileListSelection((File) value);
    } /**
     * drag完成后的操作
     */
    @Override
    protected void exportDone(JComponent source, Transferable data, int action) {
    if (!(action == MOVE)) {
    return;
    }
    JList list = (JList) source;
    DefaultListModel listModel = (DefaultListModel) list.getModel();
    listModel.remove(list.getSelectedIndex());
    } /**
     * 传输数据的包装类
     * 
     * @author Administrator
     * 
     */
    class FileListSelection implements Transferable { DataFlavor[] flavors = { DataFlavor.javaFileListFlavor };
    // File file;
    List<File> files = new ArrayList<File>(); public FileListSelection(File file) {
    super();
    files.add(file);
    } public FileListSelection(List<File> files) {
    super();
    files.addAll(files);
    } @Override
    public DataFlavor[] getTransferDataFlavors() {
    return flavors;
    } @Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
    return flavor.equals(DataFlavor.javaFileListFlavor);
    } @Override
    public Object getTransferData(DataFlavor flavor)
    throws UnsupportedFlavorException, IOException {
    if (isDataFlavorSupported(flavor)) {
    return (Object) files;
    }
    return null;
    } } public static void main(String[] args) {
    JList list = new JList();
    // 可以drag
    list.setDragEnabled(true);
    // 设置TransferHandler
    list.setTransferHandler(new FileListDropTransferHandler());
    DefaultListModel model = new DefaultListModel();
    list.setModel(model);
    // drop插入和覆盖均可
    list.setDropMode(DropMode.ON_OR_INSERT); JScrollPane pane = new JScrollPane(list); JFrame frame = new JFrame(); frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(pane, BorderLayout.CENTER); frame.setSize(640, 480);
    frame.setVisible(true);
    }}