【问题标题】:Java: How to drag a file from a JTable to native filesystem?Java:如何将文件从 JTable 拖到本机文件系统?
【发布时间】:2013-05-02 08:05:30
【问题描述】:

我的 Java 7 Swing 应用程序具有一个包含以下对象的 JTable:

public class MyFile {

    private long id;
    private long created;
    private long modified;
    private String description;
    private File file;

    public MyFile(long id) {
        this.id = id;
        this.created = System.currentTimeMillis();
    }

    // getter & setter methods ...

}

目标是将这些 MyFile 对象从我的应用程序中拖放到文件系统中(例如桌面)。在将 setDragEnabled(true) 设置为我的 JTable 时,拖动表格条目时图标已经变成了“+”符号,正如其他应用程序的常规拖放操作所知道的那样。但是当实际将对象放到桌面上时,什么都没有发生......

如何告诉我的 JTable 只将 File 对象放入 MyFile 对象中?我是不是忘记了更多的东西?

有人可以提供一个简短的样本吗?

非常感谢您提前提供的帮助!

【问题讨论】:

    标签: java swing file drag-and-drop jtable


    【解决方案1】:

    您必须确保创建的Transferable 包含DataFlavor#javaFileListFlavor,并且该风味的数据是包含在您的MyFile 实例中的File(更准确地说:List 和@ 987654327@,如该风格的 javadoc 中所述)。

    这可能需要在您的JTable 上自定义TransferHandler

    【讨论】:

    • 我怀疑...,也许是在文件未存储在 XxxTableModel 的情况下
    • 您能否提供更多信息、简短的操作方法甚至是示例:-)?
    【解决方案2】:

    使用以下属性配置您的表格:

    tblDocuments.setDragEnabled(true);
    tblDocuments.setTransferHandler(new FileTransferHandler());
    

    这是 TransferHandler 的实现:

    public class FileTransferHandler extends TransferHandler {
    
        @Override
        protected Transferable createTransferable(JComponent c) {
            List<File> files = new ArrayList<File>();
            // copy your files from the component to a concrete List<File> files ...
            // the following code would be a sample for a JList filled with java.io.File(s) ...
            /*JList list = (JList) c;
            for (Object obj: list.getSelectedValues()) {
                files.add((File)obj);
            }*/
            return new FileTransferable(files);
        }
    
        @Override
        public int getSourceActions(JComponent c) {
            return MOVE;
        }
    }
    

    这是 FileTransferable 的实现:

    public class FileTransferable implements Transferable {
    
        private List<File> files;
    
        public FileTransferable(List<File> files) {
            this.files = files;
        }
    
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[]{DataFlavor.javaFileListFlavor};
        }
    
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return flavor.equals(DataFlavor.javaFileListFlavor);
        }
    
        public Object getTransferData(DataFlavor flavor)
                throws UnsupportedFlavorException, IOException {
            if (!isDataFlavorSupported(flavor)) {
                throw new UnsupportedFlavorException(flavor);
            }
            return files;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      相关资源
      最近更新 更多