首页 > 解决方案 > Javafx 拖放到查找器

问题描述

我试图在 Finder/Windows 资源管理器中实现拖放功能。每当我在拖动板上使用多个文件调用我的函数时,java 就会崩溃,因为 OSX 向我显示了一个异常,即源的数量和目标的数量不一样。在 javafx 中,您不能在节点列表上开始拖放,只能在一个节点上开始拖放。

我怎样才能存档这个我可以将节点列表拖放到 Finder 而不会崩溃?换句话说,我如何创建一个源不是节点的拖板,instat 源是节点列表?

这是我的实际代码:

imageGrid.setOnDragDetected((t) -> {
        /* drag was detected, start a drag-and-drop gesture*/
        Dragboard db = imageGrid.startDragAndDrop(TransferMode.ANY);            
        final ClipboardContent content = new ClipboardContent();

        List<File> fileList = new ArrayList<>();
        Set<Node> selection = factory.getSelectionModel().getSelection();
        selection.forEach((k) -> {
            fileList.add(new File(((MediaGridCell) k).getItem().getName()));
        });
        content.putFiles(fileList);
        db.setContent(content);
        t.consume();
    });

标签: javafxdrag-and-drop

解决方案


我不确定我是否完全理解您的问题,但无论如何我都会尝试一下,因为您已经好几天没有收到任何反馈了。

当您使用 时ClipboardContent.putFiles(),您正在使用:

DataFormat FILES = new DataFormat("application/x-java-file-list", "java.file-list");

根据Object您尝试放入的,ClipboardContent您可以使用另一个DataFormat. 鉴于ArrayList默认情况下该类是可序列化的(不确定Node),您可以这样做:

final DataFormat dataFormat = new DataFormat("application/x-java-serialized-object");

public getClipboardContent(ArrayList<Serializable> list) {
    ClipboardContent cc = new ClipboardContent();
    cc.put(dataFormat, list);
    return cc;
}

public List<File> getList(Dragboard db) {
    return db.getContent(dataFormat);
}

推荐阅读