JavaFX с выравнивания меток в gridpane в

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

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

1 ответов


TL: DR version: вместо label.setAlignment(Pos.CENTER_RIGHT); использовать GridPane.setHalignment(label, HPos.RIGHT);.

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

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

указывает, как текст и графика внутри метки должны быть выровнены, когда есть пустое пространство внутри метки.

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

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

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

GridPane.setFillWidth(label, true);

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

label.setMaxWidth(Double.MAX_VALUE);

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

label.setAlignment(Pos.CENTER_RIGHT);

он выровняет свой собственный контент справа.

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

GridPane.setHalignment(label, HPos.RIGHT);

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

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