Когда дело доходит до минимальных, предпочтительных и максимальных размеров Region
, существует три различных режима 1 :
- Разработчикустанавливает их явно (например,
setPrefWidth(400)
). - Они установлены на
Region.USE_COMPUTED_SIZE
(т.е. -1.0
) 2 . - Ониустановлены на
Region.USE_PREF_SIZE
(т.е. отрицательная бесконечность) 1 .
1.Предпочтительные размеры имеют только два режима, поскольку USE_PREF_SIZE
имеет значение только для минимального и максимального размеров.
2.Это значение по умолчанию для Region
и большинства (всех?) Его подклассов.
Когда размеры установлены на USE_COMPUTED_SIZE
, это означает, что значения вычисляются во время макета с использованием защищенныхметоды, такие как:
И аналогичные методы дляминимальные и максимальные размеры.
Однако, когда дело доходит до Control
с, эти вычисления обычно делегируются классу скина.Большинство реализаций скинов наследуются от SkinBase
, который предоставляет аналогичные методы для вычисления измерений min / pref / max;они имеют одинаковые имена, но принимают больше параметров, чтобы сделать вычисления немного легче.Вы отмечаете в комментарии , что в случае TableView
вычисления для предпочтительной ширины и высоты выполняются в TableViewSkinBase
.
.интересно, как вы можете получить это вычисленное значение;Я не верю, что вы можете надежным способом.Вы можете попробовать использовать открытые методы Node
, такие как Node.prefWidth(double)
, но проблема заключается в том, чтобы знать, какое значение передать в качестве аргумента.В случае, если значение не должно быть -1
, тогда только родитель точно знает, сколько места доступно.
Примечание: эти методы Node
(например, prefWidth(double)
) являются «точкой входа» для получения минимальных, предпочтительных и максимальных размеров Node
.Однако свойства min
, pref
и max
не являются универсальными (доступны для Region
с и, в некоторой степени, WebView
), а методы computeXXX
уникальны для Parent
(иего подклассы).Другие типы Node
s, такие как Shape
s, предоставляют свои собственные внутренние механизмы.
Кроме того, предпочтительные размеры являются лишь ориентировочными.Родитель может свободно определять размер своих потомков так, как считает нужным в пределах ограничений min и max.Если вы хотите узнать, каковы размеры узла в конечном итоге, вы можете использовать свойства Region.width
и Region.height
(при использовании Region
) или свойство Node.boundsInLocal
(для произвольного Node
).WebView
и некоторые реализации Shape
также предоставляют свойства для определения их размеров.
Примечание:
ЭтоОтвет фокусируется на Node
s (то есть на графике сцены).Как указывает Клеопатра, другие объекты (например, TableColumnBase
), которые имеют свойства, такие как prefWidth
, не имеют такого же определенного поведения, как Region
.Например, установка значения -1
не определяется для того, чтобы вести себя так же.Это также относится к WebView
, который, хотя и имеет свойства размера min / pref / max, не является Region
.
Реализация скина по умолчанию TableView
учитываетprefWidth
каждого видимого TableColumn
при расчете его предпочтительной ширины.