Пакет javafx.scene.layout
Предоставляет классы для поддержки макета пользовательского интерфейса. Каждый класс панели макета поддерживает различную стратегию макета для своих дочерних элементов, и приложения могут вкладывать эти панели макета для достижения необходимой структуры макета в пользовательском интерфейсе. После добавления узла на одну из панелей макета, панель автоматически будет управлять макетом для узла, поэтому приложение не должно позиционировать или изменять размер узла напрямую; см. "Изменяемость размера узла" для получения дополнительной информации.
Механизм макета сцены
Механизм макета сцены автоматически управляется системой после того, как приложение создает и отображает Scene. Сцена макета обнаруживает динамические изменения узлов, влияющие на макет (например, изменение размера или содержимого), и вызывает requestLayout(), что отмечает эту ветвь как требующую макета, чтобы в следующем цикле была выполнена проходка сверху вниз по этой ветви, вызвав layout() в корневой части этой ветви. Во время этого прохода метод обратного вызова layoutChildren() будет вызываться для каждого родителя, чтобы расположить его дочерние элементы. Этот механизм разработан для максимальной эффективности макета, гарантируя, что несколько запросов на макет объединяются и обрабатываются в одном проходе, а не выполняется повторный макет для каждого незначительного изменения. Поэтому приложения не должны вызывать макет узлов напрямую.
Изменяемость размера узла
Сцена макета поддерживает классы узлов с изменяемым и неизменяемым размером. Метод isResizable() в Node возвращает, является ли данный узел изменяемым или нет. Класс узла с изменяемым размером — это тот, который поддерживает диапазон допустимых размеров (минимальный <= предпочтительный <= максимальный), позволяющий родительскому элементу изменять его размер в этом диапазоне во время макета, учитывая политику макета родительского элемента и потребности в макете соседних узлов. Узел поддерживает следующие методы для кода макета, чтобы определить диапазон изменяемости размера узла:
public Orientation getContentBias()
public double minWidth(double height)
public double minHeight(double width)
public double prefWidth(double height)
public double prefHeight(double width)
public double maxWidth(double height)
public double maxHeight(double width)
С другой стороны, классы узлов с неизменяемым размером не имеют согласованного API изменения размера и не изменяются размером родительскими элементами во время макета. Приложения должны устанавливать размер узлов с неизменяемым размером, задавая соответствующие свойства для каждого экземпляра. Эти классы возвращают текущие границы макета для min, pref и max, и метод resize() становится бесполезным.
Классы с изменяемым размером: Region, Control, WebView
Классы с неизменяемым размером: Group, Shape, Text
Например, элемент управления кнопкой (с изменяемым размером) вычисляет минимальный, предпочтительный и максимальный размеры, которые его родительский элемент будет использовать для изменения его размера во время макета, поэтому приложению нужно только настроить его содержимое и свойства:
Button button = new Button("Apply");
Однако круг (с неизменяемым размером) не может быть изменен размером родительским элементом, поэтому приложение должно установить соответствующие геометрические свойства, определяющие его размер: Circle circle = new Circle();
circle.setRadius(50);
Диапазон изменяемости размера
Каждый класс узла с изменяемым размером вычисляет соответствующий минимальный, предпочтительный и максимальный размеры на основе собственного содержимого и настроек свойств (собственный диапазон размера). Некоторые классы с изменяемым размером имеют неограниченный максимальный размер (все панели макета), в то время как у других максимальный размер по умолчанию ограничен их предпочтительным размером (кнопки) (см. документацию по отдельным классам для диапазона по умолчанию для каждого класса). Хотя эти значения по умолчанию ориентированы на общее использование, приложениям часто необходимо явно изменять или устанавливать диапазон изменяемости размера узла для достижения определенных макетов. Классы с изменяемым размером предоставляют свойства для переопределения минимальных, предпочтительных и максимальных размеров в этих целях.Например, чтобы переопределить предпочтительный размер ListView:
listview.setPrefSize(200,300);
Или, чтобы изменить максимальную ширину кнопки, чтобы она увеличивалась для заполнения пространства:
button.setMaxWidth(Double.MAX_VALUE);
В обратном случае, когда приложению нужно ограничить минимальный или максимальный размер узла его предпочтительным размером:
listview.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
И, наконец, если приложению нужно восстановить значения, вычисленные внутри класса: listview.setPrefSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
Стиль CSS и размеры узлов
Приложения не могут надежно запросить границы узла с изменяемым размером до его добавления на сцену, потому что размер этого узла может зависеть от CSS. Это связано с тем, что CSS используется для стилизации многих аспектов узла, которые влияют на его предпочтительный размер (шрифт, отступы, границы и т. д.), и поэтому узел не может быть отформатирован (изменен размером) до тех пор, пока CSS не будет применен, и родительский элемент не сможет получить метрики валидного диапазона размеров. Это всегда верно для элементов управления (и любых панелей, которые их содержат), потому что они полагаются на CSS для своего стиля по умолчанию, даже если пользовательские таблицы стилей не были установлены. Таблицы стилей устанавливаются на уровне сцены, что означает, что стили даже не могут быть определены до инициализации сцены, содержащей узел. После инициализации сцены CSS применяется к узлам в каждом цикле (при необходимости) непосредственно перед проходом макета.Визуальные границы против границ макета
Графически богатый пользовательский интерфейс часто нуждается в различении визуальных границ узла и границ, используемых для макета. Например, узкие визуальные границы глифов символов узла Text не подойдут для макета, так как текст не будет выровнен, а пробелы в начале и конце будут проигнорированы. Кроме того, приложения иногда хотят применять эффекты и преобразования к узлам, не нарушая окружающий макет (отскок, подергивание, тени, свечения и т. д.). Для поддержки этого различия в графическом деревеNode предоставляет свойство layoutBounds для определения «логической» границы узла для макета и boundsInParent для определения визуальных границ после применения всех эффектов, обрезки и преобразований. Эти два свойства границ часто различаются для данного узла, и layoutBounds вычисляется по-разному в зависимости от класса узла:
| Тип узла | Границы макета |
|---|---|
Shape,ImageView
| Включает геометрические границы (геометрия плюс обводка). НЕ включает эффект, обрезку или преобразования. |
Text | логические границы, основанные на высоте шрифта и ширине содержимого, включая пробелы. можно настроить, чтобы это были границы вокруг глифов символов, установив boundsType. НЕ включает эффект, обрезку или преобразования. |
Region, Control, WebView
| всегда [0,0 width x height] независимо от визуальных границ, которые могут быть больше или меньше, чем границы макета. |
Group | Объединение всех визуальных границ видимых дочерних элементов (boundsInParent). НЕ включает эффект, обрезку или преобразования, заданные непосредственно для группы, однако ВКЛЮЧАЕТ эффект, обрезку, преобразования, заданные для отдельных дочерних элементов, поскольку они включены в boundsInParent дочернего элемента. |
Например, если к форме добавлен DropShadow, эта тень не будет учитываться в макете по умолчанию. Или, если используется ScaleTransition для пульсирования размера кнопки, эта анимация пульсации не будет нарушать макет вокруг этой кнопки. Если приложение хочет, чтобы эффект, обрезка или преобразование учитывались в макете узла, оно должно обернуть этот узел в группу.
-
Краткое описание классов Класс Описание AnchorPane AnchorPane позволяет привязывать края дочерних узлов к смещению от краев панели AnchorPane.Background ФонRegion.BackgroundFill Заливка и связанные свойства, определяющие, как заполнить фонRegion.BackgroundImage Определяет свойства, описывающие, как отобразить изображение в качестве фона для некоторогоRegion.BackgroundPosition Представляет положениеBackgroundImageвнутри области отрисовкиRegion.BackgroundSize Определяет размер области, которую BackgroundImage должен заполнить относительно Region, которую он стилизует.Border ГраницаRegion.BorderImage Определяет свойства, описывающие, как отобразить изображение в качестве рамки некоторого Region.BorderPane BorderPane выкладывает дочерние элементы в позициях сверху, слева, справа, снизу и по центру.BorderStroke Определяет обводку дляBorderдля стилизацииRegion.BorderStrokeStyle Определяет стиль обводки для одной стороны BorderStroke.BorderWidths Определяет ширину для четырёх компонентов (верх, право, низ, и лево).ColumnConstraints Определяет необязательные параметры макета для столбца вGridPane.ConstraintsBase Базовый класс для определения параметров макета, специфичных для узла.CornerRadii Определяет радиусы каждого из четырёх углов BorderStroke.FlowPane FlowPane выкладывает дочерние элементы в поток, который переходит на новую строку при достижении границы FlowPane.GridPane GridPane выкладывает дочерние элементы в гибкой сетке строк и столбцов.HBox HBox выкладывает дочерние элементы в единственной горизонтальной строке.Pane Базовый класс для панелей макета, которые должны предоставлять список дочерних элементов как публичный, так что пользователи подкласса могут свободно добавлять/удалять дочерние элементы.Region Region является базовым классом для всех UI-контролов JavaFX на основе узлов и всех контейнеров макета.RowConstraints Определяет необязательные параметры макета для строки вGridPane.StackPane StackPane выкладывает свои дочерние элементы в стопке спереди назад.TilePane TilePane выкладывает дочерние элементы в сетке из одинаковых по размеру "плиток".VBox VBox выкладывает свои дочерние элементы в один вертикальный столбец. -
Краткое описание перечислений Перечисление Описание BackgroundRepeat Перечисление вариантов повторения изображений в фонахBorderRepeat Перечисление, указывающее правила повторения изображений рамки.Priority Перечисление, используемое для определения приоритета увеличения (или уменьшения) области макета данного узла, когда у его области больше (или меньше) доступного пространства, и несколько узлов конкурируют за это пространство.
© 2008, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from JavaFX API Documentation.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Java, JavaFX and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.