javafx - 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();
});
解决方案
我不确定我是否完全理解您的问题,但无论如何我都会尝试一下,因为您已经好几天没有收到任何反馈了。
当您使用 时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);
}