JavaFX如何滚动ScrollPane以使节点位于视口中间?

6

我需要创建一个带有当前时间线的时间轴。 我正在使用AnchorPane,在其中添加了放置在ScrollPane中的线条。 我需要模拟一天的时间,scrollpane的宽度为(2880px,每60px表示一小时)。 我的限制是(前一天12小时和后一天12小时)。 移动我的线条工作得很好。

我要做的就是将线条设置在视口的中心,并在其下移动内容。 对于移动线条,我使用以下方法:

scrollPane.setHvalue( line.getStartX() - anchorPane.width); 

这个功能“基本上可以正常工作”。内容在移动,但是线也在移动。我从线的0:00位置(位置设置为0.25)开始,并在位置为(0.75)24小时时结束。我还将时间轴Y进行了缩放。

/* where line position is calculate by scale, scale is x2, x3, x4.... */
scrollPane.setHvalue( line.getStartX() - anchorPane.width * scale); 

请参考以下图片中的时间:0:00、12:00、24:00... 正确的线位置仅在12:00处... 如何修改函数以设置线的位置?

简而言之,绿线代表当前时间,您希望它始终保持在滚动窗格中间的同一位置,而时间轴图从右向左流动。是这样吗? - Uluk Biy
是的,确切地说……我只想让这个面板在绿线下移动。(顶部轴与其绑定) - kingkong
基本观察是(hValue-hMin)/(hMax-hMin) = x / (contentWidth - viewportWidth),其中x是视口左边缘与内容左边缘的水平偏移量。然后你有centerX = x + viewportWidth/2 => 参考JamesD在如何在ScrollPane中居中缩放节点?的回答。 - jewelsea
3个回答

0

这个公式对我在滚动窗格中居中我的对象起作用:

scrollPane.setHvalue(line.getX() - scrollPane.getWidth() / 2) / (anchorPane.getWidth() - scrollPane.getWidth()));

0

我不确定我是否完全理解你的问题。我看到的是你有一个带有绿线节点的滚动窗格,是吗?如果是这样的话...

如果绿线是一个节点,也许你可以为滚动窗格的显示值(hvalue,我相信)注册一个事件处理程序。例如,每次修改滚动窗格的滚动值时,应该更新绿线节点的平移位置。我不是布局专家。JavaFX对我来说仍然很新。但据我所知,似乎是可行的。从理论上讲,这显然是可以做到的。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接