JavaFX - 使用正确的滚动方向向ScrollPane添加节点

时间:2013-08-07 04:20:15

标签: javafx-2 scrollpane

我的场景中有一个ScrollPane,想要添加一系列节点。确切的数量必须是动态的。我一直在使用Label节点测试这个概念,并且可以根据我想要的内容成功添加ScrollPane(目前是VBox)的内容。

我的问题是弄清楚如何让用户正常滚动ScrollPane中的节点。内容与滚动条匹配;也就是说,当我向下滚动时,内容向下移动。我向上滚动,内容向上滚动。因此,如果我有10个标签,其中只有五个当前可见,那么看到其他五个标签的本能行动就是向下滚动。不幸的是,这只是将整个内容向下移动,将空白区域暴露在顶部并隐藏更多标签。

如果有帮助,我可以发布一些示例代码,但我的攻击计划的要点是:

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);
}

因为我使用的是VBox,所以标签被堆叠在一起(在Y轴上),这就是我想要的。随着更多标签的添加,ScrollBar需要反映增加的VBox大小。 我已经尝试了一些方法来实现这一点,包括ScrollPane.setVmax()方法,这没关系,但我仍然有滚动方向的问题将内容向错误的方向移动。我还尝试了EventHandlerEventFilter来相应地修改值,仍然没有解决滚动问题,没有向正确的方向移动内容。

答案看起来很简单,但即使经过很长时间搞乱代码,它仍会继续逃避我。

编辑:

jewelsea建议使用ListView解决了我的问题。但是,我仍然很好奇为什么使用ScrollPane并没有那么好。另外,我使用ListView实现遇到了奇怪的行为:我使用一个按钮手动向视图添加新的Label。在添加新的Label后,视图会不时地冻结。在更新滚动位置或显示新添加的Label之前,它会锁定几秒钟。我不知道这是不是因为视图管理了大约20个Label个实例,或者是否有更多阴险的东西在起作用。

1 个答案:

答案 0 :(得分:1)

关于滚动窗格问题,我知道你想要做什么是可能的,因为我做的事情非常相似。根据您上面给出的代码片段,我建议尝试一些事情......

  • 为ScrollPane提供首选的高度和宽度。
  • 不要给内容VBox任何高度大小的偏好,因为它会随着内容的增长而增长。添加内容后,无需更新其高度。
  • 使用VBox的 setAlignment 方法将其内容与 TOP_LEFT TOP_CENTER TOP_RIGHT 对齐。
  • 使用 getPrefHeight()方法时要小心,因为如果您事先未使用 setPrefHeight(),我相信它会返回 -1

希望这会帮助你!