Почему добавлены две ColumnConstraints в FXML? - PullRequest
0 голосов
/ 30 ноября 2019

Я новичок в JavaFX и в моем sample.fxml файле я нашел два ColumnConstraints, но я не знаю, почему их два, потому что, когда я удалил один из них, вид изменился.

<GridPane fx:controller="sample.Controller" xmlns:fx="http://javafx.com/fxml" 
          alignment="center" hgap="10" vgap="10" gridLinesVisible="true">

    <columnConstraints>

        <ColumnConstraints percentWidth="100"/>
        <ColumnConstraints percentWidth="100"/>

    </columnConstraints>


</GridPane>

1 Ответ

2 голосов
/ 01 декабря 2019

A GridPane имеет один или более столбцов. Для каждого столбца могут быть наложены ограничения, что достигается с помощью ColumnConstraints экземпляров, добавленных в список GridPane#getColumnConstraints(). Из документации:

Возвращает список ограничений столбцов. Ограничения столбцов могут быть добавлены для явного контроля размеров отдельных столбцов и поведения макета. Если не установлен, размер столбца и поведение макета вычисляются на основе содержимого. Индекс в ObservableList обозначает номер столбца, поэтому ограничение столбца для первого столбца находится в позиции 0 [выделение добавлено].

Примечание: Если вы не знаете, файл FXML просто описывает граф объектов, а затем FXMLLoader анализирует файл и устанавливает соответствующие свойства или добавляет элементы в соответствующие коллекции. Элемент <columnConstraints> ссылается на упомянутый выше список, а экземпляры ColumnConstraints добавляются в указанный список. См. Введение в FXML для получения дополнительной информации.

Как видите, индекс ColumnConstraints в списке определяет, к какому столбцу применяются ограничения. Ваш файл FXML добавляет два ограничения, что означает, что вы добавляете ограничения как для первого, так и для второго столбцов. Хотя, если честно, не имеет смысла для двух столбцов использовать 100% ширины. Теперь, если ваш sample.fxml файл был создан в тот момент, когда вы его опубликовали (т.е. вы не сильно изменились), и вам интересно , почему ваш инструмент автоматически добавил два ограничения - я не могу ответить.

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

<GridPane fx:controller="sample.Controller" xmlns:fx="http://javafx.com/fxml" 
          alignment="center" hgap="10" vgap="10" gridLinesVisible="true">

    <fx:define>
        <ColumnConstraints fx:id="colConstraints" percentWidth="100"/>
    </fx:define>

    <columnConstraints>

        <fx:reference source="colConstraints"/>
        <fx:reference source="colConstraints"/>

    </columnConstraints>


</GridPane>

Что касается того, почему ваш вид изменился, когда вы удалили один из ColumnConstraints, наличие ограничений заставляет столбец существовать, даже если в столбце нет содержимого,И когда в столбце нет содержимого, если вы удалите ограничение, столбец перестанет существовать.

Поведение RowConstraints такое же, за исключением того, что ограничения применяются к строкам вместо столбцов (очевидно,).

...