JavaFX слушатель видимой части VBox - PullRequest
1 голос
/ 18 февраля 2020

У меня есть JavaFX VBox внутри BorderPane (центральный). Содержимое VBox рассчитывается с использованием бизнес-логики c и зависит от высоты видимой части 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.

Я ищу слушателя, который бы сообщал об изменении высоты центральной части пограничной панели. Так что в моем примере он всегда должен печатать «75» независимо от того, сколько строк я добавил в vBox. Единственное событие , изменяющее значение должно быть изменение размера всего окна. В действительности, как только vBox заполнен, мой слушатель сообщает об увеличении значений высоты. Очевидно, свойство height включает в себя невидимую часть vbox.

EDIT

Наконец я нашел какое-то решение - поместить 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();
    }
}
...