У меня есть 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();
}
}