Java:如何将文件从JTable拖动到本机文件系统?

sal*_*inx 5 java swing drag-and-drop file jtable

我的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 ...

}
Run Code Online (Sandbox Code Playgroud)

目标是将这些MyFile对象拖出我的应用程序并将其拖放到文件系统(例如,桌面).将setDragEnabled(true)设置为JTable时,拖动表条目时图标已变为"+"符号,如其他应用程序的常规拖放操作所示.但实际上将对象丢弃到桌面时没有任何反应......

我怎么能告诉我的JTable只下降了文件里面对象MyFile的对象?我忘记了更多的东西吗?

有人可以提供简短的样品吗?

非常感谢您的帮助!

sal*_*inx 3

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

tblDocuments.setDragEnabled(true);
tblDocuments.setTransferHandler(new FileTransferHandler());
Run Code Online (Sandbox Code Playgroud)

这是 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 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;
    }
}
Run Code Online (Sandbox Code Playgroud)