JavaFX ScrollPane以编程方式移动视口 - 居中内容

and*_*dyw 5 java viewport scrollpane panning javafx-2

我可以使用setVvalue(double)和setHvalue(double)方法在JavaFX ScrollPane中移动视口.我正在努力做的是根据其位置将特定节点置于滚动窗格的内容中.我尝试了各种localToScene()和boundsInParent()的组合.我已阅读(很多)并看过这个例子

如何滚动以在ScrollPane的内容中显示节点?

哪个接近但不使对象居中只是让它们可见.内置鼠标平移功能非常出色,但我正在进行程序化平移的恶劣天气.

最终我需要能够进行缩放,所以我将实际形状放在一个组中,并将该组添加到滚动窗格内容中.我想我应该对组进行缩放,然后我需要能够围绕组的中心进行缩放,以便我们回到操作并识别当前的中心位置.任何可以提供的指针或示例都会非常感激.上面链接中的代码示例是一个很好的SSCCE.

提前致谢,

安迪

Håv*_*hus 13

我会尝试在没有代码的情况下解释这个,因为我不认为这是必要的.

假设滚动窗格的内容具有高度h,视口的高度为v.如果h = v,那么内容将完全适合视口,并且您不需要滚动条.在这种情况下(使用不可移动的滚动条),对于要居中的元素,需要将其定位在滚动窗格内容的中心.您无法通过滚动将其移动到视口的中心.

现在考虑h是v(即h = 2v)的两倍大小.在这种情况下,滚动窗格内容的上1/4和下1/4无法通过滚动居中.

(如果你绝对需要通过滚动来集中任何组件,你应该考虑填充内容窗格,但我们将继续使用未填充的解决方案)

当你考虑它时,你会意识到滚动条可能的可滚动距离h - v,你将通过设置vvalue为1.0 滚动该数量.

要使点居中y(此处y点是滚动窗格内容窗格的坐标),您可以使用以下vvalue:

vvalue = (y - 0.5 * v) / (h - v) 
Run Code Online (Sandbox Code Playgroud)

当y点在视口内居中时,此表达式的分母是视口顶部显示的y坐标.分母是总可滚动距离.

编辑:无论如何添加一些代码!

public void centerNodeInScrollPane(ScrollPane scrollPane, Node node) {
    double h = scrollPane.getContent().getBoundsInLocal().getHeight();
    double y = (node.getBoundsInParent().getMaxY() + 
                node.getBoundsInParent().getMinY()) / 2.0;
    double v = scrollPane.getViewportBounds().getHeight();
    scrollPane.setVvalue(scrollPane.getVmax() * ((y - 0.5 * v) / (h - v)));
}
Run Code Online (Sandbox Code Playgroud)

(请注意,这假定节点是滚动窗格内容窗格的直接子节点)

希望这可以帮助!:)

  • 谢谢,即使节点不是滚动窗格的直接子节点,这也很有效:我之间有一个AnchorPane. (2认同)

小智 0

我知道,有点晚了,但也许有人会发现它有用。:)

至于居中,这并不是一项艰巨的任务,只需要一点数学知识。你需要两件事。ScrollPane 整个内容的大小(可滚动区域的宽度和高度,不仅是带有滚动条的框架,而且就像不存在滚动条一样完整)以及 ScrollPane 内容内居中对象的位置。

你得到的内容大小是这样的:scrollPane.getContent().getBoundsInLocal().getHeight() or .getWidth()

以及物体的位置:node.getBoundsInParent().getMinY() or .getMinX()- 物体的最小位置。您也可以获得它的高度和宽度。

然后根据这个公式计算中心的位置并移动滚动条。

double vScrollBarPosition = scrollPane.getVMax() * (yPositionOfCenter / heightOfScrollPaneContent)