and*_*dyw 5 java viewport scrollpane panning javafx-2
我可以使用setVvalue(double)和setHvalue(double)方法在JavaFX ScrollPane中移动视口.我正在努力做的是根据其位置将特定节点置于滚动窗格的内容中.我尝试了各种localToScene()和boundsInParent()的组合.我已阅读(很多)并看过这个例子
哪个接近但不使对象居中只是让它们可见.内置鼠标平移功能非常出色,但我正在进行程序化平移的恶劣天气.
最终我需要能够进行缩放,所以我将实际形状放在一个组中,并将该组添加到滚动窗格内容中.我想我应该对组进行缩放,然后我需要能够围绕组的中心进行缩放,以便我们回到操作并识别当前的中心位置.任何可以提供的指针或示例都会非常感激.上面链接中的代码示例是一个很好的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)
(请注意,这假定节点是滚动窗格内容窗格的直接子节点)
希望这可以帮助!:)
小智 0
我知道,有点晚了,但也许有人会发现它有用。:)
至于居中,这并不是一项艰巨的任务,只需要一点数学知识。你需要两件事。ScrollPane 整个内容的大小(可滚动区域的宽度和高度,不仅是带有滚动条的框架,而且就像不存在滚动条一样完整)以及 ScrollPane 内容内居中对象的位置。
你得到的内容大小是这样的:scrollPane.getContent().getBoundsInLocal().getHeight() or .getWidth()
以及物体的位置:node.getBoundsInParent().getMinY() or .getMinX()- 物体的最小位置。您也可以获得它的高度和宽度。
然后根据这个公式计算中心的位置并移动滚动条。
double vScrollBarPosition = scrollPane.getVMax() * (yPositionOfCenter / heightOfScrollPaneContent)