Перейти к содержимому

Stackpane javafx что это

  • автор:

Stackpane javafx что это

Панель компоновки 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(); >>

StackPane в JavaFX

По умолчанию элементы центрируются в контейнере. Поскольку кнопка добавляется последней, то она накладывается поверх остальных. Однако вряд ли такой интерфейс можно считать оптимальным. Поскольку нет смысла располагать кнопки и метки поверх друг друга. Но с помощью статического метода 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 может расположить элемент по каком-то определенном месте контейнера.

Alignment в StackPane в JavaFX

Среди методов 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 в StackPane в JavaFX

Для установки отступов применяется объет Insects, в конструктор которого передается значение отступов от верхней, правой, нижней и левой границы контейнера соответственно.

Введение в JavaFx и работа с layout в примерах

Доброго времени суток. В этой статье я расскажу основы работы с классами пакета javafx.scene.layout.* (BorderPane, AnchorPane, StackPane, GridPane, FlowPane, TilePane, HBox, VBox) и их особенностями в пошаговых примера и иллюстрациях. Также в кратце пробежимся по иерархии классов JavaFx.

После установки Eclipse и плагина e(fx)lipse создадим новый проект:

Выбираем JavaFx проект:

По дефолту Eclipse создаст такую заготовку:

package application; import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.BorderPane; public class Main extends Application < @Override public void start(Stage primaryStage) < try < BorderPane root = new BorderPane(); Scene scene = new Scene(root,400,400); scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.show(); >catch(Exception e) < e.printStackTrace(); >> public static void main(String[] args) < launch(args); >> 

На сцену добавляется корневой узел, им должен быть класс унаследованный от Parent (узел, который может иметь детей) корневой узел добавляется на сцену (специальный контейнер для всего контента графа узлов), а она в свою очередь на стейжд, который и показывается.

Давайте разберемся с иерархией классов JavaFx:

Самым базовым абстрактным классом является Node — узел в графе сцены, наследникам предоставляются поля для настройки размеров: (minWidth — минимальная ширина, minHeight — минимальная высота, prefWidth — предпочтительная ширина, prefHeight — предпочтительная высота, maxWidth — максимальная ширина, maxHeight — максимальная высота).

Координаты узла: getLayoutX() и getLayoutY()
relocate(double x, double y) — изменяет координаты узла, если необходимо настроить положение каждой координаты по отдельности, используйте setLayoutX(double value) и setLayoutY(double value)

Важно понимать, что выставленные координаты и размеры (pref то есть prefer — предпочтительно) при компоновке, в зависимости от иерархии графа узлов и их настроек могу отличаться от ожидаемых. Примеры приведу чуть позже.

Node не может содержать дочерних элементов это и логично, для этого существует Parent прямой наследник Node, в который можно добавлять и удалять дочерние узлы. Кстати, говоря, есть классы которые представляю узлы, но не содержат дочерние узлы: Camera, Canvas, ImageView, LightBase, MediaView, Parent, Shape, Shape3D, SubScene, SwingNode.

Нас сегодня интересует подгруппа наследников класса Region (базовый класс всех лайуат контейнеров) в частности поговорим о основных потомках класса Pane о панелях, которые чаще всего требуются в повседневной разработке.

BorderPane

Это специальная панель которая располагает свою дочерние узлы верхней(setTop(Node)), нижней(setBottom(Note)), левой(setLeft(Node)), правой(setRight(Node)) и центральной(setCenter(Node)) позициях, добавим несколько кнопок во все эти позиции на BotderPane:

BorderPane root = new BorderPane(); root.setLeft(new Button("Left")); root.setTop(new Button("Top")); root.setRight(new Button("Right")); root.setBottom(new Button("Bottom")); root.setCenter(new Button("Center")); 

У секции top и bottom приоритет, поэтому они сужаю по высоте все остальные:

При попытке задать координаты к примеру у верхней кнопки:

BorderPane root = new BorderPane(); root.setLeft(new Button("Left")); Button topButton = new Button("Top"); topButton.setLayoutX(20.0); topButton.setLayoutY(20.0); root.setTop(topButton); root.setRight(new Button("Right")); root.setBottom(new Button("Bottom")); root.setCenter(new Button("Center")); 

Кнопка не изменит своего положения, почему так происходит? При компоновке детей в методе layoutChildren класса BorderPane переопределяется позиция каждого узла с учетом всех настроек. Решений исправить есть несколько, например поместить (обернуть) кнопку в дополнительный подходящий контейнер, например в базовую для всех панелей

Pane
BorderPane root = new BorderPane(); root.setLeft(new Button("Left")); // Pane pane = new Pane(); Button topButton = new Button("Top"); topButton.setLayoutX(20.0); topButton.setLayoutY(20.0); pane.getChildren().add(topButton); root.setTop(pane); // root.setRight(new Button("Right")); root.setBottom(new Button("Bottom")); root.setCenter(new Button("Center")); 

Потому как Pane никак не переопределяет положение своих детей, мы получаем нужное смещение:

Можно не оборачивать кнопку, а просто выставить у нее внешний отступ c помощью статического метода setMargin(Node child, Insets value):

BorderPane.setMargin(topButton, new Insets(20.0)); 

Insets — вспомогательный класс для настройки отступов, конструктор у него перегружен, может принимать один аргумент для все сторон, так и для каждой стороны в отдельности, пока мы настроили для все сторон один отступ, вот что мы получили:

Уберем отступы снизу и справа и получим желаемое смещение кнопки:

BorderPane.setMargin(topButton, new Insets(20.0, 0.0, 0.0, 20.0)); 
StackPane

Теперь давайте рассмотрим ситуацию в которой панель навязывает детям не только позицию, но и пытается их растянуть по всей ширине и высоте, заполнив всю область контента, заменим BorderPane и добавим туда сначала TextArea и Button.

StackPane root = new StackPane(); root.getChildren().add(new TextArea("TextArea in StackPane")); root.getChildren().add(new Button("Button in StackPane")); Scene scene = new Scene(root,250,250); 

Кстати, для добавления нескольких узлов в нужном порядке можно использовать метод:

root.getChildren().addAll(Node1, Node2, . ); 

Что мы видим, текстовое поле растянулись по нашей панели, а кнопка центрировалась:

Центрирование можно корректироваться с помощью setAlignment(Pos)

root.setAlignment(Pos.BOTTOM_RIGHT); 

Сделать внутренний отступ с помощью setPadding(Insets)

root.setPadding(new Insets(10.0)); 

Можно сделать индивидуальную настройку центрирования и отступов каждого узла с помощью статических методов:

StackPane root = new StackPane(); TextArea textArea = new TextArea("TextArea in StackPane"); StackPane.setMargin(textArea, new Insets(10.0, 0.0, 30.0, 50.0)); Button button = new Button("Button in StackPane"); StackPane.setAlignment(button, Pos.CENTER_RIGHT); root.getChildren().addAll(textArea, button); 

AnchorPane

Якорная панель позволяет края дочерних узлов привязывать смещениями к краям панели, рассмотрим пример:

Добавим кнопку и привяжем ее к правому краю:

AnchorPane root = new AnchorPane();
Button button = new Button(«Button in AnchorPane»);
root.getChildren().add(button);
AnchorPane.setRightAnchor(button, 10.0);

Добавим привязку к нижнему краю:

AnchorPane.setBottomAnchor(button, 10.0); 

Теперь в левому краю и верхнему:

AnchorPane.setRightAnchor(button, 10.0); AnchorPane.setTopAnchor(button, 10.0); 

Получаем что края кнопки теперь жестко привязаны к краям панели, если начать тянуть окно, кнопка будет также тянуться.

GridPane

Рассмотрим очень полезную сеточную панель, добавление детей в эту панель необходимо делать через метод add(Node child, int columnIndex, int rowIndex) в котором первый параметр добавляемый узле, второй номер колонки, третий номер строки, вот простой пример:

GridPane root = new GridPane(); // Для отображения сетки root.setGridLinesVisible(true); root.add(new Label("0x0"), 0, 0); root.add(new Label("0x1"), 0, 1); root.add(new Label("1x1"), 1, 1); root.add(new Label("1x2"), 1, 2); root.add(new Label("5x5"), 5, 5); 

Мы видим, что узлы можно добавлять в любую ячейку, пустые столбцы и строки создаются автоматически:

Для работы с колонками, есть специальный класс ColumnConstraints, для этого надо создать колонки, настроить их и добавить их в GridPane, в примеру если мы хотим выставить ширины первой колонки 130, а второй 20%:

GridPane root = new GridPane(); root.setGridLinesVisible(true); root.add(new Label("0x0"), 0, 0); root.add(new Label("0x1"), 0, 1); root.add(new Label("1x1"), 1, 1); root.add(new Label("1x2"), 1, 2); root.add(new Label("5x5"), 5, 5); // ColumnConstraints columnConstraints = new ColumnConstraints(); columnConstraints.setPrefWidth(130.0); ColumnConstraints columnConstraints1 = new ColumnConstraints(); columnConstraints1.setPercentWidth(20); root.getColumnConstraints().addAll(columnConstraints, columnConstraints1); // 

Это самые базовые возможности, потребуется написать отдельную статья, для охвата всех тонкостей настройки GridPane.

FlowPane

Давайте сразу к примеру из него сразу станет все понятно, добавим шесть кнопок в FlowPane:

FlowPane root = new FlowPane(); root.getChildren().add(new Button("Button #1")); root.getChildren().add(new Button("Button #2")); root.getChildren().add(new Button("Button #3")); root.getChildren().add(new Button("Button #4")); root.getChildren().add(new Button("Button #5")); root.getChildren().add(new Button("Button #6")); 

Посмотрим результат, кнопка выводятся одна за другой (по дефолту у FlowPane горизонтальный вывод Orientation.HORIZONTAL)

Теперь при уменьшении окна по ширине, мы видим что дочерние узлы начинают переносится:

И соответственно если выставить вертикальную ориентацию

root.setOrientation(Orientation.VERTICAL); 

При при уменьшении высоты окна получаем перенос:

Вертикальные и горизонтальные отступы между элементами можно настроиться с помощью:

root.setVgap(8); root.setHgap(4); 

TilePane
Работа этой панели схожа с работой FlowPane, отличие в том что дочерние узлы помещаются в сетку ячейки которой одинакового размера, приведем предыдущий пример, но в этот раз пусть одна кнопка будет больших размеров, чем остальные:

Как мы видим все узлы теперь находятся в «тайла» одинаковых размеров, растянутых по наибольшему узлу.

HBox и VBox

Это обычные горизонтальный и вертикальный списки, комбинируйте их, чтобы добиться нужного результата:

VBox root = new VBox(); HBox hBox = new HBox(); hBox.getChildren().addAll(new Button("Button#1"), new Button("Button#2")); Slider slider = new Slider(1.0, 10.0, 4.0); slider.setShowTickLabels(true); root.getChildren().add(new Label("Label")); root.getChildren().addAll(hBox, slider); 

Это все наследники класса Pane, спасибо за внимание.

Stackpane javafx что это

StackPane размечает свои дочерние элементы в наоборот стек. Z-порядок дочерних элементов определяется по приказу дочернего списка с 0th дочерним элементом, являющимся нижней частью и последним дочерним элементом на вершине. Если граница и/или дополнение были установлены, дочерние элементы будут layed в пределах тех вставок. stackpane попытается изменить размеры каждого дочернего элемента, чтобы заполнить его область контента. Если дочерний элемент не мог бы быть измерен, чтобы заполнить stackpane (или потому что это не было изменяемого размера или его максимальный размер, предотвращенный это), тогда, это будет выровненное в пределах области, используя свойство выравнивания, который значения по умолчанию На месте продажи Центрироваться. Пример StackPane:

 StackPane stack = new StackPane(); stack.getChildren().addAll(new Rectangle(100,100,Color.BLUE, new Label("Go!)); 

StackPane размечает каждый управляемый дочерний элемент независимо от видимого значения свойства дочернего элемента; игнорируются неуправляемые дочерние элементы. StackPane может быть разработан с фонами и границами, используя CSS. См. Region для деталей.

Диапазон изменяемого размера

Родитель stackpane изменит размеры stackpane в пределах диапазона stackpane изменяемого размера во время расположения. По умолчанию stackpane вычисляет этот диапазон, основанный на его контенте как обрисовано в общих чертах в таблице ниже.

width height
минимум уехавшиеся/исправленные вставки плюс самая большая из детских минимальных ширин. вершина/нижняя часть вставляет плюс самая большая из детских минимальных высот.
привилегированный уехавшиеся/исправленные вставки плюс самая большая из детских ширин приставки. вершина/нижняя часть вставляет плюс самая большая из детских высот приставки.
максимум Двойной. MAX_VALUE Двойной. MAX_VALUE

Неограниченный максимальный width stackpane и height являются индикацией родителю, которого это может быть изменено вне его привилегированного размера, чтобы заполнить независимо от того, что пространство присваивается этому. StackPane обеспечивает свойства для того, чтобы они установили диапазон размера непосредственно. Эти свойства значение по умолчанию к сигнальной метке оценивают USE_COMPUTED_SIZE, однако приложение может установить их в другие значения как необходимый:

 // ensure stackpane is never resized beyond it's preferred size stackpane.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 

Приложения могут восстановить вычисленные значения, задерживая эти свойства к USE_COMPUTED_SIZE. StackPane не отсекает свой контент по умолчанию, таким образом, возможно, что границы дочерних элементов могут расшириться вне его собственных границ, если минимальный размер дочернего элемента препятствует тому, чтобы это было пригодно в пределах stackpane.

Дополнительные Ограничения Расположения

Приложение может установить ограничения на отдельные дочерние элементы, чтобы настроить расположение StackPane. Для каждого ограничения StackPane обеспечивает статический метод для того, чтобы он установил это на дочернем элементе.

Ограничение Ввести Описание
выравнивание javafx.geometry. На месте продажи Выравнивание дочернего элемента в пределах stackpane.
поле javafx.geometry. Вставки Граничное пространство вокруг за пределами дочернего элемента.
 // Align the title Label at the bottom-center of the stackpane Label title = new Label(); StackPane.setAlignment(title, Pos.BOTTOM_CENTER); stackpane.getChildren.addAll(new ImageView(. ), title); // Create an 8 pixel margin around a listview in the stackpane ListView list = new ListView(); StackPane.setMargin(list, new Insets(8,8,8,8); stackpane.getChildren().add(list); 

Сводка свойства

Свойства

Ввести Свойство и Описание
ObjectProperty выравнивание

Stackpane javafx что это

StackPane размечает свои дочерние элементы в наоборот стек. Z-порядок дочерних элементов определяется по приказу дочернего списка с 0th дочерним элементом, являющимся нижней частью и последним дочерним элементом на вершине. Если граница и/или дополнение были установлены, дочерние элементы будут layed в пределах тех вставок. stackpane попытается изменить размеры каждого дочернего элемента, чтобы заполнить его область контента. Если дочерний элемент не мог бы быть измерен, чтобы заполнить stackpane (или потому что это не было изменяемого размера или его максимальный размер, предотвращенный это), тогда, это будет выровненное в пределах области, используя свойство выравнивания, который значения по умолчанию На месте продажи Центрироваться. Пример StackPane:

 StackPane stack = new StackPane(); stack.getChildren().addAll(new Rectangle(100,100,Color.BLUE), new Label("Go!)); 

StackPane размечает каждый управляемый дочерний элемент независимо от видимого значения свойства дочернего элемента; игнорируются неуправляемые дочерние элементы. StackPane может быть разработан с фонами и границами, используя CSS. См. Region для деталей.

Диапазон изменяемого размера

Родитель stackpane изменит размеры stackpane в пределах диапазона stackpane изменяемого размера во время расположения. По умолчанию stackpane вычисляет этот диапазон, основанный на его контенте как обрисовано в общих чертах в таблице ниже.

width height
минимум уехавшиеся/исправленные вставки плюс самая большая из детских минимальных ширин. вершина/нижняя часть вставляет плюс самая большая из детских минимальных высот.
привилегированный уехавшиеся/исправленные вставки плюс самая большая из детских ширин приставки. вершина/нижняя часть вставляет плюс самая большая из детских высот приставки.
максимум Двойной. MAX_VALUE Двойной. MAX_VALUE

Неограниченный максимальный width stackpane и height являются индикацией родителю, которого это может быть изменено вне его привилегированного размера, чтобы заполнить независимо от того, что пространство присваивается этому. StackPane обеспечивает свойства для того, чтобы они установили диапазон размера непосредственно. Эти свойства значение по умолчанию к сигнальной метке оценивают USE_COMPUTED_SIZE, однако приложение может установить их в другие значения как необходимый:

 // ensure stackpane is never resized beyond it's preferred size stackpane.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 

Приложения могут восстановить вычисленные значения, задерживая эти свойства к USE_COMPUTED_SIZE. StackPane не отсекает свой контент по умолчанию, таким образом, возможно, что границы дочерних элементов могут расшириться вне его собственных границ, если минимальный размер дочернего элемента препятствует тому, чтобы это было пригодно в пределах stackpane.

Дополнительные Ограничения Расположения

Приложение может установить ограничения на отдельные дочерние элементы, чтобы настроить расположение StackPane. Для каждого ограничения StackPane обеспечивает статический метод для того, чтобы он установил это на дочернем элементе.

Ограничение Ввести Описание
выравнивание javafx.geometry. На месте продажи Выравнивание дочернего элемента в пределах stackpane.
поле javafx.geometry. Вставки Граничное пространство вокруг за пределами дочернего элемента.
 // Align the title Label at the bottom-center of the stackpane Label title = new Label(); StackPane.setAlignment(title, Pos.BOTTOM_CENTER); stackpane.getChildren.addAll(new ImageView(. ), title); // Create an 8 pixel margin around a listview in the stackpane ListView list = new ListView(); StackPane.setMargin(list, new Insets(8,8,8,8); stackpane.getChildren().add(list); 

Сводка свойства

Все Методы Методы экземпляра Конкретные Методы

Ввести Свойство и Описание
ObjectProperty выравнивание

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *