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