Класс javafx.scene.layout.HBox организует все вложенные элементы в виде горизонального ряда.
Для создания объекта HBox можно использовать один из конструкторов класса:
HBox()
: определяет пустой объект HBox
HBox(double spacing)
: определяет пустой объект HBox, в котором элеметы будут находиться друг от друга на расстоянии spacing
HBox(double spacing, Node... children)
: определяет объект HBox, заполненный элементами nodes, которые находятся друг от друга на расстоянии spacing
HBox(Node... children)
: определяет объект HBox, заполненный элементами nodes
Определим простой HBox:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.HBox; 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"); HBox root = new HBox(10, label1, label2, label3, label4, label5, label6, label7); Scene scene = new Scene(root, 300, 150); stage.setScene(scene); stage.setTitle("HBox in JavaFX"); stage.show(); } }
Может показаться, что HBox ничем не отличается от FlowPane в горизонтальной ориентации. Однако если вложенные элементы не умещаются по длине контейнера, то они не переносятся на новую строку, а сжимаются, чтобы соответствовать по совокупности ширине контейнера.
Некоторые из методов HBox:
getAlignment(): получает выравнивание внутри FlowPane в виде объекта Pos
setAlignment(Pos value): задает выравнивание
getSpacing(): возвращает расстояние между элементами
setSpacing(double value): устанавливает расстояние между элементами
getHgrow(Node child): возвращает для элемента child ограничение hgrow в виде объекта Priority
setHgrow(Node child, Priority value): устанавливает для элемента child ограничение hgrow
setFillHeight(boolean value): при передачи значения true расширяет HBox по всей высоте контейнера
isFillHeight(): возвращает логическое значение true или false, которое указывает, развернут ли HBox по всей высоте контейнера
setMargin(Node child, Insets value): устанавливает для элемента child внешние отступы от границ контейнера
getMargin(Node child): получает внешние отступы элемента от границ контейнера
Особого внимания заслуживает метод setHgrow(), который позволяет установить для элемента ограничение hgrow. Это ограничение представляет класс 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.HBox; public class Main extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { HBox hbox = new HBox(); Button button1 = new Button("Add"); Button button2 = new Button("Remove"); hbox.getChildren().addAll(button1, button2); Scene scene = new Scene(hbox, 300, 150); stage.setScene(scene); stage.setTitle("HBox in JavaFX"); stage.show(); } }
Две кнопки вполне умещаются по ширине HBox, однако часть пространства контейнера остается не заполненным, да и сами кнопки выглядят не очень хорошо:
Используем ограничение hgrow:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.HBox; 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) { HBox hbox = new HBox(); Button button1 = new Button("Add"); Button button2 = new Button("Remove"); HBox.setHgrow(button1, Priority.ALWAYS); HBox.setHgrow(button2, Priority.ALWAYS); button1.setMaxWidth(Double.MAX_VALUE); button2.setMaxWidth(Double.MAX_VALUE); hbox.getChildren().addAll(button1, button2); Scene scene = new Scene(hbox, 300, 150); stage.setScene(scene); stage.setTitle("HBox in JavaFX"); stage.show(); } }
Для кнопок с помощью setMaxWidth задана максимальная ширина, которая принимает максимально допустимое значение для типа double. А в качестве ограничения для обеих кнопок задано значение Priority.ALWAYS, которое указывает, что кнопки автоматически будут масштабироваться, чтобы заполнить пространство контейнера..