2016-02-16 5 views
5

Я смущен, почему настройка Label.setAlignment (Pos.CENTER_RIGHT) не влияет на выравнивание метки, которая затем добавляется в GridPane? Единственный способ сделать это, по-видимому, через сетку (например, ColumnConstraints) или, например, добавив ярлык к HBox, который имеет правильное выравнивание.Выравнивание JavaFX метки в GridPane

Почему установка выравнивания метки на CENTER_RIGHT не влияет? Я вижу, что API говорит: «Указывает, как текст и графику в Labeled должны быть выровнены, когда в Labeled есть пустое пространство». Но как мне получить пустое место на этикетке?

ответ

13

TL: DR версия: вместо label.setAlignment(Pos.CENTER_RIGHT);GridPane.setHalignment(label, HPos.RIGHT);.

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

Согласно документации для Label, то alignmentProperty

Определяет, как текст и графика в пределах Маркированный должны быть выровнены, когда есть пустое пространство внутри Меченый.

Конечно, количество свободного места на этикетке определяется его родителем, которое в этом случае является сеткой. Конечно, вы можете узнать о стратегии компоновки сетки и как ее настроить, прочитав ее documentation. Вкратце:

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

Таким образом, вы можете установить выравнивание на этикетке на CENTER_RIGHT, а затем проинструктировать панель сетки, чтобы метка увеличивалась. Это нужно две вещи: во-первых, скажите панель сетки, чтобы метка заполнить ширину ячейки:

GridPane.setFillWidth(label, true); 

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

label.setMaxWidth(Double.MAX_VALUE); 

Тогда метка будет расти до размера ячейки, и поэтому, если у вас также есть

label.setAlignment(Pos.CENTER_RIGHT); 

будет согласовывать свою собственный вправо.

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

GridPane.setHalignment(label, HPos.RIGHT); 

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

Вы также можете использовать объект ColumnConstraints, чтобы установить выравнивание по умолчанию для всех меток в определенном столбце, что гораздо удобнее, если вы строите форму.

+0

спасибо, это отличный ответ. – Tranquility

+0

Одна точка примечания. Я нахожу либо задавая ширину предпочтительной метки для большего значения, либо задавая максимальную ширину, как вы указали, а затем устанавливая выравнивание вправо, она выравнивается правильно. Другими словами, вызов setFillWidth не нужен? Можете ли вы объяснить, почему это так, и когда мне нужно будет использовать setFillWidth? – Tranquility

+0

'setFillWidth (true)' означает, что панель сетки будет определять размер узла до максимальной его максимальной ширины или ширины столбца. Если 'setFillWidth' является ложным (по умолчанию), то устанавливается ширина узла до его предпочтительной ширины. Обратите внимание, что ширина столбца определяется максимальной шириной pref всего содержимого; поэтому, увеличивая ширину префикса узла, вы можете заставить столбец быть более широким, чем вы хотите. –

Смежные вопросы