2013-08-07 52 views
5

我在我的场景中有一个ScrollPane,并且想要为它添加一系列节点。确切的金额必须是动态的。我一直在用Label节点测试这个概念,并且可以成功添加尽可能多的标签,以满足ScrollPane(当前是VBox)的内容。JavaFX - 以正确的滚动方向向ScrollPane添加节点

我的问题是搞清楚如何让用户正常滚动通过ScrollPane充满节点。内容与滚动条一致;也就是说,当我向下滚动时,内容向下移动。我向上滚动,内容滚动。因此,如果我有10个标签,其中只有5个标签目前可见,那么看到其他五个标签的直觉行为就是向下滚动。不幸的是,这只是将整个内容向下移动,将空白空间暴露在上面并隐藏更多标签。

我可以张贴一些示例代码是否有帮助,但我的进攻计划的要点是:

ScrollPane sp = new ScrollPane(); 
VBox content = new VBox(); 
sp.setContent(content); 
for (int i = 0; i < 10; i++) 
{ 
    Label label = new Label("Label " + i); 
    content.setPrefHeight(content.getPrefHeight() + label.getPrefHeight()); 
    content.getChildren().add(label); 
} 

因为我使用的是垂直框,标签堆叠(Y轴)顶上一个另一个,这是我想要的。随着更多标签的添加,ScrollBar需要反映VBox的增大尺寸。 我已经尝试了几种方法来实现这个工作,包括ScrollPane.setVmax()方法,这没问题,但我仍然遇到滚动方向将内容向错误方向移动的问题。我也尝试过EventHandlerEventFilter来修改相应的值,但仍然没有解决滚动问题而不能将内容向正确的方向移动。

答案似乎很简单,但它仍然继续逃避我,即使经过很长时间的代码乱七八糟。

编辑:使用ListView解决我的问题的

jewelsea的建议。然而,我仍然好奇为什么使用ScrollPane没有那么好。另外,我遇​​到了ListView实现中奇怪的行为:我使用一个按钮手动将新的Label添加到视图。无论何时,添加新的Label后,视图都会冻结。在更新滚动位置或显示新添加的Label之前,它会锁定几秒钟。我不知道这是否是因为视图管理大约20个左右的实例,或者是否有更危险的事情发挥作用。

+2

任何不使用'ListView'来实现的理由?我认为这可能会为您解决这些问题。 – jewelsea

+2

@jewelsea,你解决了它!我总是惊讶于大多数这些问题看起来如此之大,但他们的解决方案如此简单。我能够使用'ListView

回答

0

关于scrollpane问题,我知道你想要做什么是可能的,因为我正在做一些非常相似的事情。基于上面给出的代码片段,我会建议尝试几件事...

  • 给ScrollPane一个首选的高度和宽度。
  • 不要给VBox任何高度尺寸偏好设定内容,因为它会随其内容一起增长。添加内容后,不需要更新其高度。
  • 使用垂直框的参考setAlignment方法来调整其内容要么TOP_LEFTTOP_CENTER,或TOP_RIGHT
  • 使用getPrefHeight()方法时,因为如果你还没有使用setPrefHeight()事先我相信它会返回-1一定要小心。

希望这可以帮助你!

+0

虽然它不在上面的代码片段中,但我明确地设置了ScrollPane的尺寸(在Scene Builder和我的代码中)。我也在切换内容的高度之间切换,并且我确实指定了一个对齐方式。经过一番更多的调整之后,我可以添加更好的东西,但我仍然无法按照自己想要的方式进行滚动。 –