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

时间:2019-01-16 10:06:23

标签: css javafx fxml

这是我的.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:idid吗?

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

编辑:

  

TableColumn还包含以下必要属性:

     
      
  • 调整大小(使用minWidth / prefWidth / maxWidth和width属性)
  •   

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

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

1 个答案:

答案 0 :(得分:3)

  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-width CSS属性的属性。

当您这样做:

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

您正在使用property setter设置minWidth的{​​{1}}属性。这与设置CSS属性并不相似。

但是, JavaFX CSS参考指南确实document认为TableColumnTableColumn子结构的一部分。这似乎表明您可以通过CSS设置列的样式。但同样,这些属性实际上不是可样式化的。 TableView方法返回getCssMetaData()

Collections.emptyList()确实实现了TableColumnBaseStyleable来自何处),这意味着它具有以下方法:getCssMetaData()。一旦显示了getStyleableNode(),此方法的TableColumn实现将返回TableColumnHeader的实例。这意味着应用于TableView的所有CSS实际上都是 应用于TableColumn的。后者是扩展TableColumnHeader并因此具有可样式化的Region属性的类。通过一些测试,minWidth实例的minWidth属性可以按预期设置。

问题似乎是TableColumnHeader的{​​{1}}对minWidth没有影响。该实现仅考虑TableColumnHeader。不幸的是,这意味着您将无法从CSS设置TableColumn中的TableColumn.minWidth

此行为可能是一个错误。