Панель компоновки javafx.scene.layout.StackPane позволяет располагать элементы поверх других элементов, то есть в виде стека, где каждый новый элемент наслаивается поверх другого. По умолчанию StackPane пытается масштабировать каждый вложенный элемент таким образом, чтобы он заполнил все пространство контейнера. Если вложенный элемент не может быть отмасштабирован, то он располагается по центру контейнера.
StackPane имеет два конструктора:
StackPane(): создает пустой объект StackPane
StackPane(Node... children): создает объект StackPane, заполненный узлами children
Создадим простейший StackPane:
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.StackPane; public class Main extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Label headerLbl = new Label("Press the login button"); Label statusLbl = new Label("Start screen"); Button loginBtn = new Button("Login"); StackPane root = new StackPane(headerLbl, statusLbl, loginBtn); Scene scene = new Scene(root, 300, 150); stage.setScene(scene); stage.setTitle("StackPane in JavaFX"); stage.show(); } }
По умолчанию элементы центрируются в контейнере. Поскольку кнопка добавляется последней, то она накладывается поверх остальных. Однако вряд ли такой интерфейс можно считать оптимальным. Поскольку нет смысла располагать кнопки и метки поверх друг друга. Но с помощью статического метода setAlignment() можно опредленным образом позиционировать вложенный элемент:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Button; import javafx.geometry.Pos; import javafx.scene.layout.StackPane; public class Main extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Label headerLbl = new Label("Press the login button"); StackPane.setAlignment(headerLbl, Pos.TOP_CENTER); Label statusLbl = new Label("Start screen"); StackPane.setAlignment(statusLbl, Pos.BOTTOM_CENTER); Button loginBtn = new Button("Login"); StackPane root = new StackPane(headerLbl, statusLbl, loginBtn); Scene scene = new Scene(root, 300, 150); stage.setScene(scene); stage.setTitle("StackPane in JavaFX"); stage.show(); } }
С помощью значения перечисления Pos StackPane может расположить элемент по каком-то определенном месте контейнера.
Среди методов StackPane следует отметить следующие:
Pos getAlignment()
: возвращает параметры выравнивания элемента
static Pos getAlignment(Node child)
: возвращает параметры выравнивания для элемента child внутри StackPane
static Insets getMargin(Node child)
: возвращает для элемента child отступы от границ контейнера StackPane
void setAlignment(Pos value)
: устанавливает параметры выравнивания для StackPane
static void setAlignment(Node child, Pos value)
: устанавливает параметры выравнивания для элемента child внутри StackPane
sstatic void setMargin(Node child, Insets value)
: устанавливает для элемента child отступы от границ контейнера StackPane
Например, устаовим отступы элментов от границ StackPane:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Button; import javafx.geometry.Pos; import javafx.geometry.Insets; import javafx.scene.layout.StackPane; public class Main extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Label headerLbl = new Label("Press the login button"); StackPane.setAlignment(headerLbl, Pos.TOP_CENTER); StackPane.setMargin(headerLbl, new Insets(10, 0, 0, 0)); Label statusLbl = new Label("Start screen"); StackPane.setAlignment(statusLbl, Pos.BOTTOM_CENTER); StackPane.setMargin(statusLbl, new Insets(0, 0, 10, 0)); Button loginBtn = new Button("Login"); StackPane root = new StackPane(headerLbl, statusLbl, loginBtn); Scene scene = new Scene(root, 300, 150); stage.setScene(scene); stage.setTitle("StackPane in JavaFX"); stage.show(); } }
Для установки отступов применяется объет Insects, в конструктор которого передается значение отступов от верхней, правой, нижней и левой границы контейнера соответственно.