我将尝试在没有代码的情况下解释这一点,因为我认为这里没有必要。
假设您的滚动窗格的内容有 height h
,而视口的高度是v
。如果h = v
,那么内容将完全适合视口,并且您不需要滚动条。在这种情况下(使用不可移动的滚动条),要使元素居中,它需要位于滚动窗格内容的中心。您不能通过滚动将其移动到视口的中心。
现在考虑是(ie )h
大小的两倍。在这种情况下,滚动窗格内容的上 1/4 和下 1/4 无法通过滚动居中。v
h = 2v
(如果您绝对需要通过滚动来居中任何组件,您应该考虑填充您的内容窗格,但我们将在此处继续使用未填充的解决方案)
当您考虑它时,您会意识到滚动条的可能滚动距离是h - v
,并且您将通过设置vvalue
为 1.0 来滚动该距离。
要使一个点居中y
(这里的点 y 是滚动窗格内容窗格的坐标),您可以使用以下 vvalue:
vvalue = (y - 0.5 * v) / (h - v)
此表达式的命名者是当点 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)));
}
(请注意,这假设节点是滚动窗格内容窗格的直接子节点)
希望这可以帮助!:)