JavaFX中如何检测鼠标拖拽对象?Drag Dropped事件及getPickType疑问
JavaFX BorderPane拖拽内容获取方法
首先,你用getPickType()的方向不对,这个方法是用来判断鼠标事件的拾取类型(比如点击到节点、窗口空白区还是其他区域),和读取拖拽携带的内容完全无关。
要在onDragDropped事件中获取拖拽内容,正确的做法是使用DragEvent(拖拽相关事件的参数都是DragEvent,而非MouseEvent),具体步骤如下:
- 给BorderPane绑定拖拽释放事件,回调参数使用DragEvent:
borderPane.setOnDragDropped((DragEvent event) -> { // 处理拖拽内容的逻辑 });
- 通过DragEvent获取Dragboard对象,它是存储拖拽内容的容器:
Dragboard dragboard = event.getDragboard();
根据拖拽的数据类型,判断并读取内容:
- 获取文本内容:
if (dragboard.hasString()) { String draggedText = dragboard.getString(); // 处理文本内容 }- 获取拖拽的文件列表:
if (dragboard.hasFiles()) { List<File> draggedFiles = dragboard.getFiles(); // 处理文件列表 }- 获取自定义对象(需在拖拽起始阶段设置对应数据格式):
// 定义自定义数据格式标识 DataFormat customFormat = new DataFormat("com.yourpackage.custom-object"); if (dragboard.hasContent(customFormat)) { YourCustomObject draggedObj = (YourCustomObject) dragboard.getContent(customFormat); // 处理自定义对象 }最后标记拖拽操作完成,避免拖拽源无法结束拖拽状态:
event.setDropCompleted(true); event.consume();
额外说明:完整的拖拽流程需要配合其他事件:拖拽源需在onDragDetected事件中启动拖拽并将数据存入Dragboard;目标节点需在onDragOver事件中调用event.acceptTransferModes(...)允许拖拽进入,否则onDragDropped事件不会触发。
内容的提问来源于stack exchange,提问作者Runsva
相关产品推荐
相关产品推荐

