5

我的 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对象中?我忘了更多的东西吗?

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

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

4

2 回答 2

4

您必须确保 createdTransferable包含 theDataFlavor#javaFileListFlavor并且该风味的数据File包含在您的MyFile实例中(更准确地说:aList和 the File,如该风味的 javadoc 中所述)。

这可能需要TransferHandler在您的JTable.

于 2013-05-02T08:40:07.137 回答
3

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

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;
    }
}
于 2013-05-22T11:05:49.433 回答