1

我在BorderPane(中央)中有一个 JavaFX VBox 。VBox 的内容是使用一些业务逻辑计算的,它取决于vbox可见部分的高度。

所以基本上我需要一个监听器来观察 vbox 的可见高度的变化 = 边框窗格中央部分的高度。

以下代码演示了我尝试过的内容:

public class HelloFX extends Application {

@Override
public void start(Stage primaryStage) {
    VBox vbox = new VBox();
    vbox.boundsInParentProperty()
            .addListener((obs, oldValue, newValue) ->
                    System.out.println(newValue.getHeight()));

    Button button = new Button("ADD LINE");
    button.setPrefHeight(25);
    button.setOnAction(event ->
        vbox.getChildren().add(new Label("line")));

    BorderPane borderPane = new BorderPane();
    borderPane.setCenter(vbox);
    borderPane.setTop(button);

    Scene scene = new Scene(borderPane, 100, 100);
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {
    launch();
}

BorderPane 在顶部位置带有简单的按钮,在中央位置带有 VBox。单击按钮会向 vBox 添加一行。总场景高度为 100,按钮高度为 25,其余 (75) 为 vBox。

我正在寻找一些听众来报告边框窗格中央部分高度的变化。因此,在我的示例中,无论我在 vBox 中添加了多少行,它都应该始终打印“75”。改变值的唯一事件应该是调整整个窗口的大小。实际上,一旦 vBox 被填满,我的听众报告高度值增加。显然 height 属性包括 vbox 的不可见部分。

编辑

最后我找到了一些解决方案 - 将 vBox 放置在ScrollPane中并禁用滚动条。然后我可以简单地听一下滚动窗格的高度属性,一切都按预期工作。

public class HelloFX extends Application {

    @Override
    public void start(Stage primaryStage) {
        VBox vbox = new VBox();

        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
        scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
        scrollPane.setContent(vbox);
        scrollPane.heightProperty()
                .addListener((obs, oldValue, newValue) ->
                        System.out.println(newValue));

        Button button = new Button("ADD LINE");
        button.setPrefHeight(25);
        button.setOnAction(event ->
                vbox.getChildren().add(new Label("line")));

        BorderPane borderPane = new BorderPane();
        borderPane.setCenter(scrollPane);
        borderPane.setTop(button);

        Scene scene = new Scene(borderPane, 100, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}
4

0 回答 0