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



这是我.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无效?

在写这篇文章时,我尝试向.css添加-fx-pref-width: 40;,现在它也可以工作。

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

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

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

编辑:

表列还包含必要的属性,以便:

  • 调整大小(使用最小宽度/首选项宽度/最大宽度和宽度属性)

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

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

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

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

问题是TableColumnBase.minWidthRegion.minWidth之间的区别。前者无法从 CSS 中设置样式,因为它不是StyleableProperty。后者是并且正是定义-fx-min-widthCSS属性的属性。

当您执行以下操作时:

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

您正在使用属性资源库设置TableColumnminWidth属性。它与设置 CSS 属性不同。

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

TableColumnBase确实实现了Styleable(getCssMetaData()来自哪里),这意味着它具有以下方法:getStyleableNode()。显示TableView后,此方法的TableColumn实现将返回TableColumnHeader的实例。这意味着应用于TableColumn的任何CSS实际上都应用于TableColumnHeader。正是后一个类扩展了Region,因此具有可样式的minWidth属性。从一些测试中,TableColumnHeader实例的minWidth属性是按预期设置的。

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

此行为可能是一个错误。

最新更新