Проблемы с настройкой ширины TableColumn в FXML с использованием CSS - PullRequest
0 голосов
/ 16 января 2019

Вот мой .fxml код:

<TableColumn id="tableColumnVertical" text="">
    <graphic>
        <VBox>
            <Label text="text"/>
        </VBox>
    </graphic>
</TableColumn>

Здесь я упростил .css код:

#tableColumnVertical {
    -fx-background-color: Lime;
    -fx-min-width: 40;
    -fx-max-width: 40;
}

Это не устанавливает ширину TableColumn, но устанавливает фон. Почему?

Я могу использовать этот код:

<TableColumn id="tableColumnVertical" text="" minWidth="40" maxWidth="40">

и это работает. Почему работает inline, а .css нет?

Во время написания этого поста я попытался добавить -fx-pref-width: 40; к .css, и теперь это также работает.

1) Я хотел бы знать, почему работает inline, а .css - нет (в то время как background-color работает)? Почему после добавления prefWidth стало работать?

2) Могу ли я использовать fx:id и id?

3) Кроме того, в некоторых ответах SO я видел, как люди советуют использовать styleClass для установки стиля. Когда я должен использовать styleClass?

Edit:

TableColumn также содержит необходимые свойства:

  • Изменить размер (используя свойства minWidth / prefWidth / maxWidth и width)

https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableColumn.html

Не уверен, что это точно, но я решил опубликовать это изменение.

1 Ответ

0 голосов
/ 16 января 2019
  1. -fx-pref-width устанавливает свойство TableColumnHeader (то же самое для -fx-min-width, см. Ниже). Установка этого свойства с помощью CSS глючит: JDK-8087822 .
  2. Вы можете использовать как fx:id, так и id. Если вы установите только fx:id, он также будет использоваться для id. Если вы установите оба параметра, id используется для CSS, а fx:id используется для внедрения экземпляра в контроллер.
  3. Вы бы добавили класс стилей, если хотите одинаково стилизовать множество узлов.

Примечание. Следующее в основном касается деталей реализации JavaFX 11.0.1 (по крайней мере, я не смог найти документацию).

Проблема заключается в разнице между TableColumnBase.minWidth и Region.minWidth. Первый не подходит для CSS, потому что это не StyleableProperty. Последнее и именно это свойство определяют CSS-свойство -fx-min-width.

Когда вы делаете:

<TableColumn id="tableColumnVertical" text="" minWidth="40" maxWidth="40">

Вы устанавливаете свойство minWidth для TableColumn, используя установщик свойства . Это не аналогично настройке свойства CSS.

Тем не менее, Справочное руководство по JavaFX CSS делает документ , который TableColumn является частью подструктуры TableView. Это может указывать на то, что вы можете стилизовать столбец с помощью CSS Но опять же, ни один из свойств на самом деле не является стилем; метод getCssMetaData() возвращает Collections.emptyList().

TableColumnBase реализует Styleable (откуда взято getCssMetaData()), что означает, что он имеет следующий метод: getStyleableNode(). Реализация этого метода TableColumn после отображения TableView возвращает экземпляр TableColumnHeader. Это означает, что любой CSS, примененный к TableColumn, является на самом деле , примененным к TableColumnHeader. Именно этот последний класс расширяет Region и, таким образом, обладает свойством styleable minWidth. А из некоторых тестов свойство minWidth экземпляра TableColumnHeader установлено как ожидалось.

Проблема заключается в том, что minWidth из TableColumnHeader не влияет на TableColumn. Реализация принимает во внимание только TableColumn.minWidth. И это, к сожалению, означает, что вы не сможете установить minWidth из TableColumn из CSS.

Такое поведение может быть ошибкой.

...