TreeView使用拖放不正确的getGestureSource()

时间:2016-02-08 11:02:32

标签: javafx-8

我有一个简单的树视图,启用了拖放功能。但是,在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;
            }
        });

1 个答案:

答案 0 :(得分:0)

手势源是调用startDragAndDrop(...)的节点;你在你当前所在的任何节点实例上调用它(我想你有一些Pane的自定义子类,或者什么)。

所以你需要

treeCell.setOnDragDetected(event -> {

    Dragboard dragBoard =
        treeCell.startDragAndDrop(TransferMode.MOVE);

    // ...
});