我有一个Circles的GridPane,我希望能够将一个圆圈拖到另一个圆圈上,并将第一个圆圈的颜色应用到第二个圆圈。
我遇到的问题是我无法让目标圈子检测到dragEntered或dragOver。我已经能够使用标签成功实现此功能,但出于某种原因,Circle不会产生相同的效果。
我已经看到一些准解决方案涉及设置circle.setMouseTransparent(true),以便拖动节点下下的节点可以看到拖动,但这里也没有运气。
以下是使用标签执行类似操作的代码的链接:Hello Drag and Drop
这是我的代码的适用代码段:
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();
}
});
答案 0 :(得分:1)
James_D在上面的评论中对这个问题有正确答案。似乎即使只是让圆圈注册发生拖放,您也必须将一些数据传递给Dragboard(即使您不想将数据传递给节点)。
这已添加到我的circle.setOnDragDetected
方法中:
Dragboard db = circle.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putString(circle.getId());
db.setContent(content);
所以这个方法现在看起来像这样:
circle.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Dragboard db = circle.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putString(circle.getId());
db.setContent(content);
System.out.print("onDragDetected");
event.consume();
}
});