这是我.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:id
和id
吗?
3)此外,在一些SO答案中,我看到人们建议使用styleClass
来设置风格。我应该什么时候使用styleClass
?
编辑:
表列还包含必要的属性,以便:
- 调整大小(使用最小宽度/首选项宽度/最大宽度和宽度属性)
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableColumn.html
不确定这是否准确,但我决定发布此编辑。
-fx-pref-width
设置TableColumnHeader
的属性(与-fx-min-width
相同,见下文)。通过CSS设置此属性有问题:JDK-8087822。- 您可以同时使用
fx:id
和id
。如果您只设置fx:id
它也将用于id
。如果同时设置了两者,则id
用于 CSS,fx:id
用于将实例注入控制器。 - 如果要以相同的方式设置多个节点的样式,则可以添加一个样式类。
注意:以下内容主要涉及 JavaFX 11.0.1 的实现细节(至少,我找不到文档)。
问题是TableColumnBase.minWidth
和Region.minWidth
之间的区别。前者无法从 CSS 中设置样式,因为它不是StyleableProperty
。后者是并且正是定义-fx-min-width
CSS属性的属性。
当您执行以下操作时:
<TableColumn id="tableColumnVertical" text="" minWidth="40" maxWidth="40">
您正在使用属性资源库设置TableColumn
的minWidth
属性。它与设置 CSS 属性不同。
但是,JavaFX CSS 参考指南确实记录了TableColumn
是TableView
子结构的一部分。这似乎表明您可以通过 CSS 设置列的样式。但同样,没有一个属性实际上是可样式的;getCssMetaData()
方法返回Collections.emptyList()
。
TableColumnBase
确实实现了Styleable
(getCssMetaData()
来自哪里),这意味着它具有以下方法:getStyleableNode()
。显示TableView
后,此方法的TableColumn
实现将返回TableColumnHeader
的实例。这意味着应用于TableColumn
的任何CSS实际上都应用于TableColumnHeader
。正是后一个类扩展了Region
,因此具有可样式的minWidth
属性。从一些测试中,TableColumnHeader
实例的minWidth
属性是按预期设置的。
问题似乎是TableColumnHeader
的minWidth
对TableColumn
没有影响。实现仅考虑TableColumn.minWidth
。不幸的是,这意味着您将无法从CSS设置TableColumn
的minWidth
。
此行为可能是一个错误。