首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用TransferHandler canImport方法时,默认情况下,来自jvm外部的可转移性的传输数据是否为空?

在调用TransferHandler canImport方法时,默认情况下,来自jvm外部的可转移性的传输数据是否为空?
EN

Stack Overflow用户
提问于 2013-05-16 15:54:56
回答 1查看 2K关注 0票数 2

我正在处理对JList组件的拖放支持,我希望能够支持从文件浏览器中拖放的文件。但是,我只想让文件,而不是文件夹被拖入。因此,我试图在我的TransferHandler中这样检查它:

代码语言:javascript
复制
@Override
public boolean canImport(TransferSupport support) {

    if (support.getComponent().equals(this.resourceFileList)) {

        if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
            return false;
        } else {

            try {

                // get file list
                Transferable transferable = support.getTransferable();
                Object transferData = transferable.getTransferData(DataFlavor.javaFileListFlavor);

                // check for folders
                boolean containsFiles = false;
                List files = (List) transferData;
                for (int i = 0; i < files.size(); i++) {
                    File file = (File) files.get(i);
                    if (!file.isDirectory()) {
                        containsFiles = true;
                    }
                }

                // return file indicator
                return containsFiles;

            } catch (IOException | UnsupportedFlavorException e) {
                System.out.println("Unable to check for folders due to the following exception:\n" + e);
                return false;
            }
        }
    } else {
        return false;
    }
}

不幸的是,transferData在这里似乎是空的。然而,当调用TransferHandler的importData方法时,情况并非如此。有没有人知道这是否是某种类型的错误或想要的行为?

我在Mac (OSX10.8)上,如果它有什么区别的话,而且Java版本是1.7.0_21。

提前感谢!

编辑:

这里有一个供任何人测试的简短的SSCCE。只需将一个文件拖到列表中,然后查看控制台。

代码语言:javascript
复制
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.List;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;

public class DNDIssue extends TransferHandler {

    @Override
    public boolean canImport(TransferSupport support) {

        if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {

            try {

                Transferable transferable = support.getTransferable();
                Object transferData = transferable.getTransferData(DataFlavor.javaFileListFlavor); // <-- this returns null
                System.out.println(transferData); // null

            } catch (IOException | UnsupportedFlavorException e) {
                System.out.println("Unable to check for folders due to the following exception:\n" + e);
            } finally {
                return false;
            }
        } else {
            return false;
        }
    }

    public static void main(String[] args) {

        // create window
        JFrame window = new JFrame("DNDIssue");
        window.setSize(640, 480);
        window.setLocation(100, 100);

        // create list with model and set transfer handler
        JList<File> list = new JList<File>(new DefaultListModel<File>());
        list.setTransferHandler(new DNDIssue());

        // add enclosing scroll pane and display window
        window.getContentPane().add(new JScrollPane(list));
        window.setVisible(true);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-05-17 10:27:14

  • 在Windows 7 64位上使用JDK 1.7.0_21,您的SSCCE对我来说很好。
  • 你能试着遵循密码吗? 可传输= support.getTransferable();System.out.println(“-”);String mt = DataFlavor.javaFileListFlavor.getMimeType();for(DataFlavor df: transferable.getTransferDataFlavors()) { System.out.println(df.getMimeType());System.out.println(“+df.getMimeType().equals(Mt)”)};
  • SSCCE1.0:删除
  • SSCCE1.1:覆盖TransferHandler#importData(...)版本

sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:245),sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73),java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376),FileTransferHandler.canImport(DNDIssueTest.java:64),无跌落电流

-这个问题可能与Bug 6759788 id=6759788有关

代码语言:javascript
复制
    - via: [http://www.coderanch.com/t/466319/GUI/java/Drag-Drop](http://www.coderanch.com/t/466319/GUI/java/Drag-Drop)

  • SSCCE1.2:忽略InvalidDnDOperationException

代码语言:javascript
复制
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
import java.util.List;
import javax.swing.*;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;

public class DNDIssueTest {
  public JComponent makeUI() {
    // create list with model and set transfer handler
    JList<File> list = new JList<File>(new DefaultListModel<File>());
    list.setDropMode(DropMode.INSERT);
    list.setTransferHandler(new FileTransferHandler());
    return new JScrollPane(list);
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new DNDIssueTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

class FileTransferHandler extends TransferHandler {
  private static final boolean DEBUG = true;
  @SuppressWarnings("unchecked")
  @Override public boolean importData(TransferSupport support) {
    try {
      List files = (List)support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
      System.out.println("importData");
      if(!hasDirectory(files) && canImport(support)) {
        JList list = (JList)support.getComponent();
        DefaultListModel model = (DefaultListModel)list.getModel();
        for(Object o: files) {
          model.addElement(o);
        }
        return true;
      }
    } catch(Exception ex) {
      ex.printStackTrace();
    }
    return false;
  }
  private boolean hasDirectory(List list) {
    System.out.println("hasDirectory check");
    for (Object o: list) {
      if(o instanceof File) {
        File file = (File) o;
        if (file.isDirectory()) {
          return true;
        }
      }
    }
    return false;
  }
  @Override public boolean canImport(TransferSupport support) {
    if(!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      return false;
    }
    if(!DEBUG) return true;

    Transferable transferable = support.getTransferable();
    try {
      Object transferData = transferable.getTransferData(DataFlavor.javaFileListFlavor);
      //System.out.println(transferData); // null
      System.out.println("canImport");
      return !hasDirectory((List)transferData);
    } catch (Exception e) {
      //e.printStackTrace();
      System.out.println("*** Ignore InvalidDnDOperationException ***");
      return true;
    }
  }
}
  • SSCCE2.0:DropTargetListener版本

代码语言:javascript
复制
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.io.*;
import java.util.List;
import javax.swing.*;

public class DNDIssueTest2 {
  public JComponent makeUI() {
    final DefaultListModel<File> model = new DefaultListModel<>();
    JList<File> list = new JList<File>(model);
    DropTargetListener dtl = new DropTargetAdapter() {
      @Override public void dragOver(DropTargetDragEvent dtde) {
        if(dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
          Transferable transferable = dtde.getTransferable();
          Object transferData = null;
          try {
            transferData = transferable.getTransferData(DataFlavor.javaFileListFlavor);
          } catch(Exception ex) {
            dtde.rejectDrag();
            return;
          }
          List<File> files = (List<File>)transferData;
          for (int i = 0; i < files.size(); i++) {
            File file = (File) files.get(i);
            if (file.isDirectory()) {
              dtde.rejectDrag();
              return;
            }
          }
          dtde.acceptDrag(DnDConstants.ACTION_COPY);
          return;
        }
        dtde.rejectDrag();
      }
      @Override public void drop(DropTargetDropEvent dtde) {
        try {
          if(dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
            dtde.acceptDrop(DnDConstants.ACTION_COPY);
            Transferable transferable = dtde.getTransferable();
            List list = (List)transferable.getTransferData(DataFlavor.javaFileListFlavor);
            for(Object o: list) {
              if(o instanceof File) {
                File file = (File) o;
                model.addElement(file);
              }
            }
            dtde.dropComplete(true);
            return;
          }
        } catch(UnsupportedFlavorException ufe) {
          ufe.printStackTrace();
        } catch(IOException ioe) {
          ioe.printStackTrace();
        }
        dtde.rejectDrop();
      }
    };
    new DropTarget(list, DnDConstants.ACTION_COPY, dtl, true);
    return new JScrollPane(list);
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new DNDIssueTest2().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16592166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档