在我的应用程序中,我有BorderPane
,其中间包含ScrollPane
。 ScrollPane
有两个逻辑部分top
和bottom
。
当我创建一个显示BorderPane
的舞台时,我希望调整舞台的大小,以便只显示top
的{{1}}部分,并且用户可以向下滚动以查看ScrollPane
部分,如果他们需要的话。
因此,我尝试将bottom
的{{1}}属性绑定到prefHeight
部分的ScrollPane
属性。希望prefHeight
能够获得正确的高度,舞台将看起来“Just Right™”。出于某种原因,这个失败了。但是当我将一个监听器附加到top
属性时,它确实返回了正确的高度。所以我对发生的事情感到惊讶。
有趣的是,如果我删除ScrollPane
它在SSCCE中有效,但在实际案例中这不是一个选项。
编辑:SSCCE已更新
这是一个SSCCE:
prefHeight
实际结果:
预期结果:
答案 0 :(得分:1)
prefHeightProperty
默认为sentinel值,表示应计算pref高度。 (Region.USE_COMPUTED_SIZE
)。因此,当您绑定滚动窗格的prefHeight
时,您可以有效地指示它执行相同操作,这基本上意味着它将获得其默认大小。
说服要执行和测量的布局,以便为滚动窗格的首选高度获得正确的大小,这有点像黑客攻击。正确的布局大小取决于CSS,因此您必须首先强制应用CSS,然后您可以要求计算顶部区域的pref高度。你可以通过调用
来完成后者top.prefHeight(-1);
以下是有效的:
ScrollPane scrollPane = new ScrollPane(content);
scrollPane.setFitToWidth(true);
// scrollPane.prefHeightProperty().bind(top.heightProperty());
BorderPane root = new BorderPane(scrollPane);
root.setTop(new MenuBar(new Menu("Foo")));
Scene scene = new Scene(root);
aStage.setScene(scene);
root.applyCss();
scrollPane.setPrefHeight(top.prefHeight(-1));
root.requestLayout();
aStage.sizeToScene();
aStage.show();
aStage.toFront();
(注意不需要调用aStage.sizeToScene();
:这是默认行为。)