使用 CSS 在 FXML 中设置 TableColumn 宽度的问题

Problems with setting TableColumn width in FXML using CSS

这是我的 .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">

并且有效。为什么内联有效而 .css 无效?

在写这个 post 时,我尝试将 -fx-pref-width: 40; 添加到 .css,现在它也可以了。

1) 我想知道为什么内联有效而 .css 无效(而 background-color 有效)?为什么添加 prefWidth 后开始起作用了?

2) 我可以同时使用 fx:idid 吗?

3) 此外,在一些 SO 答案中,我看到人们建议使用 styleClass 来设置样式。我应该什么时候使用 styleClass

编辑:

a TableColumn also contains the necessary properties to:

  • Be resized (using minWidth/prefWidth/maxWidth and width properties)

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

不确定这是否准确,但我决定 post 此编辑。

  1. -fx-pref-width 正在设置 TableColumnHeader 的 属性(与 -fx-min-width 相同,见下文)。通过 CSS 设置此 属性 是错误的:JDK-8087822.
  2. 您可以同时使用 fx:idid。如果您只设置 fx:id,它也将用于 id。如果两者都设置,id 用于 CSS,fx:id 用于将实例注入控制器。
  3. 如果您想以相同的方式设置多个节点的样式,您可以添加样式 class。

注意:以下主要涉及 JavaFX 11.0.1 的实现细节(至少,我找不到文档)。

问题是 TableColumnBase.minWidthRegion.minWidth 之间的区别。前者不能从 CSS 设置样式,因为它不是 StyleableProperty。后者是 属性 定义了 -fx-min-width CSS 属性.

当你这样做时:

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

您正在使用 property setter 设置 TableColumnminWidth 属性。它不同于设置 CSS 属性.

但是,JavaFX CSS 参考指南 document TableColumnTableView 子结构的一部分.这似乎表明您可以通过 CSS 设置列的样式。但是同样,没有一个属性实际上是可设置样式的; getCssMetaData() 方法 returns Collections.emptyList()

TableColumnBase 确实实现了 StyleablegetCssMetaData() 的来源),这意味着它具有以下方法:getStyleableNode()TableColumn 这个方法的实现,一旦 TableView 已经显示,returns 一个 TableColumnHeader 的实例。这意味着应用于 TableColumn 的任何 CSS 实际上是 应用于 TableColumnHeader。正是后者 class 扩展了 Region,因此具有可样式化的 minWidth 属性。通过一些测试,TableColumnHeader 实例的 minWidth 属性 已按预期设置。

问题似乎是 TableColumnHeaderminWidthTableColumn 没有影响。该实现仅考虑 TableColumn.minWidth 。不幸的是,这意味着您将无法从 CSS.

设置 TableColumnminWidth

此行为可能是一个错误。