使用嵌套在BorderPane中的ScrollPane调整JavaFX阶段的大小

时间:2015-12-30 20:12:26

标签: java layout java-8 javafx-8

在我的应用程序中,我有BorderPane,其中间包含ScrollPaneScrollPane有两个逻辑部分topbottom

当我创建一个显示BorderPane的舞台时,我希望调整舞台的大小,以便只显示top的{​​{1}}部分,并且用户可以向下滚动以查看ScrollPane部分,如果他们需要的话。

因此,我尝试将bottom的{​​{1}}属性绑定到prefHeight部分的ScrollPane属性。希望prefHeight能够获得正确的高度,舞台将看起来“Just Right™”。出于某种原因,这个失败了。但是当我将一个监听器附加到top属性时,它确实返回了正确的高度。所以我对发生的事情感到惊讶。

有趣的是,如果我删除ScrollPane它在SSCCE中有效,但在实际案例中这不是一个选项。

编辑:SSCCE已更新

这是一个SSCCE:

prefHeight

实际结果:

enter image description here

预期结果:

enter image description here

1 个答案:

答案 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();:这是默认行为。)