Контейнер организует вложенные элементы в виде вертикального ряда.
Для создания объекта VBox применяется один из следующих конструкторов:
VBox()
: определяет пустой объект VBox
VBox(double spacing)
: определяет пустой объект VBox, элементы которого будут находиться друг от друга на расстоянии spacing. По умолчанию
это значение равно 0
VBox(double spacing, Node... children)
: определяет объект VBox, заполненный элементами nodes, которые находятся друг от друга на расстоянии spacing
VBox(Node... children)
: определяет объект VBox, заполненный элементами nodes
Определим простой VBox:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.VBox; public class Main extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Label label1 = new Label("Label1"); Label label2 = new Label("Label2"); Label label3 = new Label("Label3"); Label label4 = new Label("Label4"); Label label5 = new Label("Label5"); Label label6 = new Label("Label6"); Label label7 = new Label("Label7"); VBox root = new VBox(10, label1, label2, label3, label4, label5, label6, label7); Scene scene = new Scene(root, 300, 150); stage.setScene(scene); stage.setTitle("VBox in JavaFX"); stage.show(); } }
Если места для элементов не хватает, но они не переносятся на другой ряд.
Некоторые из методов VBox:
getAlignment(): получает выравнивание внутри FlowPane в виде объекта Pos
setAlignment(Pos value): задает выравнивание
getSpacing(): возвращает расстояние между элементами
setSpacing(double value): устанавливает расстояние между элементами
VBox.getVgrow(Node child): статический метод возвращает для элемента child ограничение vgrow в виде объекта Priority
VBox.setVgrow(Node child, Priority value): статический метод устанавливает для элемента child ограничение vgrow
setFillWidth(boolean value): при передачи значения true расширяет VBox по всей ширине контейнера
isFillWidth(): возвращает логическое значение true или false, которое указывает, развернут ли VBox по всей ширине контейнера
VBox.setMargin(Node child, Insets value): статический метод устанавливает для элемента child внешние отступы от границ контейнера
VBox.getMargin(Node child): статический метод получает внешние отступы элемента от границ контейнера
Особо выделим метод VBox.setVgrow(), который позволяет установить для элемента ограничение vgrow. Это ограничение представляет класс javafx.scene.layout.Priority и позволяет указать, как будет растягиваться вложенный элемент.
Например, растянем кнопку по всей высоте контейнера:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.VBox; import javafx.scene.layout.Priority; public class Main extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Button btn = new Button("Hello"); VBox vbox = new VBox(); VBox.setVgrow(btn, Priority.ALWAYS); btn.setMaxHeight(Double.MAX_VALUE); vbox.getChildren().addAll(btn); Scene scene = new Scene(vbox, 300, 150); stage.setScene(scene); stage.setTitle("VBox in JavaFX"); stage.show(); } }
Для кнопки с помощью setMaxHeight задается максимальная высота, которая принимает максимально допустимое значение для типа double. А в качестве ограничения устанавливается значение Priority.ALWAYS, которое поволяет автоматически масштабировать кнопку, чтобы заполнить пространство контейнера.
Подобным образом мы можем растягивать несколько элементов или комбинировать их с элементами, которое не должны растягиваться:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Button; import javafx.scene.layout.VBox; import javafx.scene.layout.Priority; public class Main extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Button okBtn = new Button("OK"); Button cancelBtn = new Button("Cancel"); Label lbl = new Label("Select"); VBox vbox = new VBox(15); VBox.setVgrow(okBtn, Priority.ALWAYS); okBtn.setMaxHeight(Double.MAX_VALUE); //okBtn.setMaxWidth(100); VBox.setVgrow(cancelBtn, Priority.ALWAYS); cancelBtn.setMaxHeight(Double.MAX_VALUE); //cancelBtn.setMaxWidth(100); vbox.getChildren().addAll(lbl, okBtn, cancelBtn); Scene scene = new Scene(vbox, 300, 150); stage.setScene(scene); stage.setTitle("VBox in JavaFX"); stage.show(); } }
Две кнопки будут заполнять равномерно пространство VBox, тогда как метка label занимает только то место, которое ей необходимо.
Однако при использовании VBox, как видно из скриншота, мы можем столкнуться с проблемой неравномерной ширины элементов. Элементы автоматически нерятягиваются по всей ширине контейнера. Чтобы выйти из этой проблемы, мы можем задать максимальную ширину для элементов:
okBtn.setMaxWidth(100); cancelBtn.setMaxWidth(100); // растяжение по всей ширине VBox // okBtn.setMaxWidth(Double.MAX_VALUE); // cancelBtn.setMaxWidth(Double.MAX_VALUE);