Spec-Zone.ru › OpenJavaFX 17

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API