Почему у JavaFX Node неправильные размеры в методе initialize?
У меня есть VBox, который хранит несколько AnchorPane. Для красоты я решил добавить css стиль на этот AnchorPane: -fx-border-width. Но VBox расположен внутри другой AnchorPane, а он соответственно внутри ScrollPane. И я обнаружил, что после добавления стиля, у меня отображаются не все элементы в ScrollPane.
Для тестирования я сделал border-width 0 0 10 0, у меня 20 элементов, таким образом, общий размер VBox после применения стиля к каждому элементу VBox должен увеличиться на 200. В методе контроллера intiailize() после вызова родительского layout и applyCss, getHeight() для VBox возвращает 1200. Затем для родительского anchorPane я ставлю высоту anchorPane.setPrefHeight(vbox.getHeight()). Но после того как мое приложение окончательно запустится, я вижу, что размер VBox 1400, как и ожидалось. Но размер AnchorPane остается 1200, и поэтому доскроллив до конца, некоторые элементы из ScrollPane не будут видны пользователю. Почему так и как это исправить?
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
for (int i = 0; i < 20; i++) {
addElementsToVBox();
}
vbox.applyCss();
vbox.layout();
mainAnchorPane.applyCss();
mainAnchorPane.layout();
System.out.println(vbox.getHeight()); //тут выдает высоту 1200,
//но если после окончательного запуска приложения сделать например кнопку,
//и в ее методе onAction() выводить vbox.getHeight(), то будет 1400
mainAnchorPane.setPrefHeight(vbox.getHeight());
}
private void addElementsToVBox() {
Label label = new Label();
label.setText("Test");
AnchorPane anchorPane = new AnchorPane();
anchorPane.getChildren().add(label);
anchorPane.setPadding( new Insets(2, 0, 2, 0) );
anchorPane.setStyle("-fx-border-width: 0 0 10 0; -fx-border-color: black");
anchorPane.applyCss();
anchorPane.layout();
vbox.getChildren().add(anchorPane);
}
Ответы (1 шт):
Проблема была в том, что в SceneBuilder у меня был заранее выставлен pref height. Из-за этого в intialize() я был вынужден использовать mainAnchorPane.setPrefHeight(vbox.getHeight()). Если же для mainAnchorPane для всех полей размеров выставить USE_COMPUTED_SIZE, а setPrefHeight() убрать из intialize(), то размер посчитается автоматически, и он будет правильным (1400 в моем случае).