Откуда берется ширина JavaFX TableView? - PullRequest
1 голос
/ 08 июня 2019

Похоже, что TableView имеет некоторую ширину по умолчанию, не зависящую от содержимого столбцов (не говоря уже о высоте и положении на экране, на которые также влияет его использование в качестве root из Scene вместо например StackPane).

Я понимаю, что каждый элемент JavaFX имеет предпочтительный размер , и эта сцена приспосабливается к нему, но мне интересно, где это взято ? Я попытался найти его в документации TableView и получить его ширину с помощью геттеров, но безуспешно.

Я знаю, что могу задавать ширину и высоту сцены явно, но это не то, что меня интересует.

В этом примере вы можете наблюдать, как изменяется размер (и положение) окна в зависимости от его содержимого.

@Override
public void start(Stage stage) throws IOException, URISyntaxException {
    TableView table = createTable();
    StackPane pane = new StackPane();

    Scene scene = new Scene(table);
//  Scene scene = new Scene(pane);
    stage.setScene(scene);
    stage.show();
}

1 Ответ

2 голосов
/ 09 июня 2019

Когда дело доходит до минимальных, предпочтительных и максимальных размеров Region, существует три различных режима 1 :

  1. Разработчикустанавливает их явно (например, setPrefWidth(400)).
  2. Они установлены на Region.USE_COMPUTED_SIZE (т.е. -1.0) 2 .
  3. Ониустановлены на 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 при расчете его предпочтительной ширины.

...