【发布时间】:2016-09-04 15:44:01
【问题描述】:
我有一个圆圈的 GridPane,我希望能够将一个圆圈拖到另一个圆圈之上,并将第一个圆圈的颜色应用于第二个圆圈。
我遇到的问题是我无法让目标圆圈检测到 dragEntered 或 dragOver。我已经能够使用标签成功地实现这一点,但由于某种原因,圆并没有产生相同的效果。
我见过一些涉及设置 circle.setMouseTransparent(true) 的准解决方案,以便被拖动节点下的节点可以看到拖动,但这里也没有运气。
这是使用标签执行类似操作的代码的链接:Hello Drag and Drop
这是我的代码的适用 sn-p:
circle.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Dragboard db = circle.startDragAndDrop(TransferMode.ANY);
System.out.print("Dragging...");
System.out.println("From row: " + draggedFromRow + " From col: " + draggedFromCol);
circle.setLayoutX(event.getSceneX());
circle.setLayoutY(event.getSceneY());
event.consume();
}
});
circle.setOnDragOver(new EventHandler <DragEvent>() {
public void handle(DragEvent event) {
System.out.println("onDragOver");
event.acceptTransferModes(TransferMode.ANY);
event.consume();
}
});
circle.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
int toCol = Integer.valueOf(circle.getId().substring(0, 1));
int toRow = Integer.valueOf(circle.getId().substring(1));
performSwap(draggedFromRow, draggedFromCol, toRow, toCol);
System.out.print("Dragg dropped on ");
System.out.println(toRow + " " + toCol);
event.consume();
}
});
circle.setOnDragEntered(new EventHandler<DragEvent>() {
public void handle(DragEvent event) {
System.out.println("drag entered!");
event.consume();
}
});
circle.setOnDragExited(new EventHandler<DragEvent>() {
public void handle(DragEvent event) {
System.out.println("drag left!");
event.consume();
}
});
【问题讨论】:
-
请发布minimal reproducible example 或sscce.org/">SSCCE</a> 以重现问题。这将增加您获得有用答案的机会(也可能帮助您找到问题)。
-
IIRC 拖放实际上不会启动,除非您将一些数据放入拖动板。
-
James_D,这解决了我的问题。谁会认为你需要它只是为了让它注册拖放正在发生。也许我只是在文档中错过了这一点。谢谢!
标签: java javafx drag-and-drop shapes