我有一个简单的树视图,启用了拖放功能。但是,在setOnDragOver()
通话时,我会收到带有手势来源的事件。 source got不是开始拖动的单元格(通过setOnDragDetected()
调用),而是包含树视图的窗格。我错过了什么?
我的代码如下所示:
tree.setCellFactory(
new Callback<TreeView<String>, TreeCell<String>>() {
@Override
public TreeCell<String> call(
final TreeView<String> param) {
TreeCell<String> treeCell =
new TreeCell<String>() {
@Override
protected void updateItem(
final String value,
final boolean empty) {
super.updateItem(value, empty);
if (!empty && (value != null)) {
setText(value);
setGraphic(getTreeItem().getGraphic());
} else {
setText(null);
setGraphic(null);
}
}
};
treeCell.setOnDragDetected(event -> {
Dragboard dragBoard =
startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putString(treeCell.getTreeItem().getValue());
dragBoard.setContent(content);
event.consume();
});
treeCell.setOnDragOver(event -> {
// Here is I've got pane instead of cell
Object source = event.getGestureSource();
if ((event.getGestureSource() != treeCell)
&& event.getDragboard().hasString()) {
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});
return treeCell;
}
});
答案 0 :(得分:0)
手势源是调用startDragAndDrop(...)
的节点;你在你当前所在的任何节点实例上调用它(我想你有一些Pane
的自定义子类,或者什么)。
所以你需要
treeCell.setOnDragDetected(event -> {
Dragboard dragBoard =
treeCell.startDragAndDrop(TransferMode.MOVE);
// ...
});