这是我的.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
无效?
在撰写本文时,我尝试将-fx-pref-width: 40;
添加到.css
,现在也可以使用。
1)我想知道为什么内联有效而.css
无效(而background-color
有效)吗?为什么添加prefWidth
后它开始起作用?
2)我可以同时使用fx:id
和id
吗?
3)另外,在一些答案中,我看到人们建议使用styleClass
来设置样式。我什么时候应该使用styleClass
?
编辑:
TableColumn还包含以下必要属性:
- 调整大小(使用minWidth / prefWidth / maxWidth和width属性)
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableColumn.html
不确定这是否正确,但我决定发布此编辑内容。
答案 0 :(得分:3)
-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">
您正在使用property setter设置minWidth
的{{1}}属性。这与设置CSS属性并不相似。
但是, JavaFX CSS参考指南确实document认为TableColumn
是TableColumn
子结构的一部分。这似乎表明您可以通过CSS设置列的样式。但同样,这些属性实际上不是可样式化的。 TableView
方法返回getCssMetaData()
。
Collections.emptyList()
确实实现了TableColumnBase
(Styleable
来自何处),这意味着它具有以下方法:getCssMetaData()
。一旦显示了getStyleableNode()
,此方法的TableColumn
实现将返回TableColumnHeader
的实例。这意味着应用于TableView
的所有CSS实际上都是 应用于TableColumn
的。后者是扩展TableColumnHeader
并因此具有可样式化的Region
属性的类。通过一些测试,minWidth
实例的minWidth
属性可以按预期设置。
问题似乎是TableColumnHeader
的{{1}}对minWidth
没有影响。该实现仅考虑TableColumnHeader
。不幸的是,这意味着您将无法从CSS设置TableColumn
中的TableColumn.minWidth
。
此行为可能是一个错误。