想要在ScrollPane中的可见区域外拖动节点时触发滚动

时间:2015-05-28 05:18:32

标签: javafx-8

我们一直在研究一个使用ScrollPane的应用程序,该ScrollPane包含一个可以根据工作区放置的节点而增长的AnchorPane。我们能够在工作区上放置节点,并能够使用鼠标拖动事件将它们拖动到不同的位置。

我现在要实现的是一种在拖动节点时自动滚动工作区并触及可见工作区边缘的方法。我已经能够检测到节点开始移出可见区域时的点,并且我可以通过设置vvalue或hvalue来移动滚动条,具体取决于节点是垂直移动还是水平移动。这在一定程度上起作用。

当我向右移动节点并更新hvalue时,工作区会滚动,设备向左移动但鼠标停留在意味着光标现在不在被拖动的节点上的位置。我一直试图找到一种方法将光标位置移动我们滚动的相同距离,使其保持相对于被拖动节点的相同位置。

我一直在寻找有关如何执行此操作以及阅读Javadocs以尝试找到解决方案但没有任何成功的信息。有人可以建议如何实现这一目标吗?感谢。

1 个答案:

答案 0 :(得分:3)

我在TreeTableView上遇到了类似的问题,并通过检测DragEnter / DragExit事件并启动TimeLine来解决它,该TimeLine将根据检测到DragExit事件的位置向上/向下滚动。

    private void setupScrolling() {
        scrolltimeline.setCycleCount(Timeline.INDEFINITE);
        scrolltimeline.getKeyFrames().add(new KeyFrame(Duration.millis(20), "Scoll", (ActionEvent) -> { dragScroll();}));
        tree.setOnDragExited(event -> {
            if (event.getY() > 0) {
                scrollDirection = 1.0 / tree.getExpandedItemCount();
            }
            else {
                scrollDirection = -1.0 / tree.getExpandedItemCount();
            }
            scrolltimeline.play();
        });
        tree.setOnDragEntered(event -> {
            scrolltimeline.stop();
        });
        tree.setOnDragDone(event -> {
            scrolltimeline.stop();
        });         
    }

完整示例:https://support.microsoft.com/en-us/kb/2020714