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

CAG*_*nzo 6 scrollpane javafx-2

我的场景中有一个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);
}
Run Code Online (Sandbox Code Playgroud)

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

答案看起来很简单,但即使经过很长时间搞乱代码,它仍然会让我躲避.

编辑:

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

Bre*_*dan 1

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

  • 为 ScrollPane 指定要遵循的首选高度和宽度。
  • 不要为内容 VBox 提供任何高度大小首选项,因为它会随内容一起增长。添加内容后也不需要更新其高度。
  • 使用 VBox 的setAlignment方法将其内容对齐TOP_LEFTTOP_CENTERTOP_RIGHT
  • 使用getPrefHeight()方法时要小心,因为如果您事先没有使用setPrefHeight()我相信它会返回-1

希望这可以帮助你!