使用 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:id
和 id
吗?
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 此编辑。
-fx-pref-width
正在设置 TableColumnHeader
的 属性(与 -fx-min-width
相同,见下文)。通过 CSS 设置此 属性 是错误的:JDK-8087822.
- 您可以同时使用
fx:id
和 id
。如果您只设置 fx:id
,它也将用于 id
。如果两者都设置,id
用于 CSS,fx:id
用于将实例注入控制器。
- 如果您想以相同的方式设置多个节点的样式,您可以添加样式 class。
注意:以下主要涉及 JavaFX 11.0.1 的实现细节(至少,我找不到文档)。
问题是 TableColumnBase.minWidth
和 Region.minWidth
之间的区别。前者不能从 CSS 设置样式,因为它不是 StyleableProperty
。后者是 属性 定义了 -fx-min-width
CSS 属性.
当你这样做时:
<TableColumn id="tableColumnVertical" text="" minWidth="40" maxWidth="40">
您正在使用 property setter 设置 TableColumn
的 minWidth
属性。它不同于设置 CSS 属性.
但是,JavaFX CSS 参考指南 document TableColumn
是 TableView
子结构的一部分.这似乎表明您可以通过 CSS 设置列的样式。但是同样,没有一个属性实际上是可设置样式的; getCssMetaData()
方法 returns Collections.emptyList()
。
TableColumnBase
确实实现了 Styleable
(getCssMetaData()
的来源),这意味着它具有以下方法:getStyleableNode()
。 TableColumn
这个方法的实现,一旦 TableView
已经显示,returns 一个 TableColumnHeader
的实例。这意味着应用于 TableColumn
的任何 CSS 实际上是 应用于 TableColumnHeader
。正是后者 class 扩展了 Region
,因此具有可样式化的 minWidth
属性。通过一些测试,TableColumnHeader
实例的 minWidth
属性 已按预期设置。
问题似乎是 TableColumnHeader
的 minWidth
对 TableColumn
没有影响。该实现仅考虑 TableColumn.minWidth
。不幸的是,这意味着您将无法从 CSS.
设置 TableColumn
的 minWidth
此行为可能是一个错误。
这是我的 .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:id
和 id
吗?
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 此编辑。
-fx-pref-width
正在设置TableColumnHeader
的 属性(与-fx-min-width
相同,见下文)。通过 CSS 设置此 属性 是错误的:JDK-8087822.- 您可以同时使用
fx:id
和id
。如果您只设置fx:id
,它也将用于id
。如果两者都设置,id
用于 CSS,fx:id
用于将实例注入控制器。 - 如果您想以相同的方式设置多个节点的样式,您可以添加样式 class。
注意:以下主要涉及 JavaFX 11.0.1 的实现细节(至少,我找不到文档)。
问题是 TableColumnBase.minWidth
和 Region.minWidth
之间的区别。前者不能从 CSS 设置样式,因为它不是 StyleableProperty
。后者是 属性 定义了 -fx-min-width
CSS 属性.
当你这样做时:
<TableColumn id="tableColumnVertical" text="" minWidth="40" maxWidth="40">
您正在使用 property setter 设置 TableColumn
的 minWidth
属性。它不同于设置 CSS 属性.
但是,JavaFX CSS 参考指南 document TableColumn
是 TableView
子结构的一部分.这似乎表明您可以通过 CSS 设置列的样式。但是同样,没有一个属性实际上是可设置样式的; getCssMetaData()
方法 returns Collections.emptyList()
。
TableColumnBase
确实实现了 Styleable
(getCssMetaData()
的来源),这意味着它具有以下方法:getStyleableNode()
。 TableColumn
这个方法的实现,一旦 TableView
已经显示,returns 一个 TableColumnHeader
的实例。这意味着应用于 TableColumn
的任何 CSS 实际上是 应用于 TableColumnHeader
。正是后者 class 扩展了 Region
,因此具有可样式化的 minWidth
属性。通过一些测试,TableColumnHeader
实例的 minWidth
属性 已按预期设置。
问题似乎是 TableColumnHeader
的 minWidth
对 TableColumn
没有影响。该实现仅考虑 TableColumn.minWidth
。不幸的是,这意味着您将无法从 CSS.
TableColumn
的 minWidth
此行为可能是一个错误。