:选择的伪类样式未应用于单元格

Vog*_*612 3 css java javafx css-selectors

我在场景中有一些TableView,我想要突出显示所选的单元格.根据JavaFX CSS参考,:selected在Cells上有一个伪类,所以我尝试了以下css:

.cell:selected {
    -fx-effect: dropshadow(gaussian, 10, .2, 4, 4);
}
Run Code Online (Sandbox Code Playgroud)

但风格不适用于细胞.当我使用.cell:hover它时按预期工作.

以下是简化的FXML:

<Pane fx:controller="Controller">
   <children>
        <TableView fx:id="table" />
   </children>
</Pane>
Run Code Online (Sandbox Code Playgroud)

我正在使用它作为控制器:

public class Controller implements Initializable{
    @FXML
    private TableView<SomeClass> table;
    // some other things

    @Override
    public void initialize(URL url, ResourceBundle bundle) {
        Objects.requireNonNull(table, "Table was not injected");
        // create columns, initialize other stuff
        table.getColumns().clear();
        table.getColumns().addAll(/*some columns */);
        table.setEditable(false);
        table.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么CSS不能应用于选定的单元格?

Vog*_*612 7

这里的问题是JavaFX处理单元格和行的选择的方式.

我们TableViewSelectionModel暂时咨询一下javadoc ,特别是cellSelectionEnabled属性:

一个布尔属性,用于表示表是处于行还是单元格选择模式.默认情况下,表处于行选择模式,这意味着无法选择单个单元格.设置cellSelectionEnabled为true会导致单元格被选中(但不能被选中).

我们可以得出结论,您的单元格未标记为已选中,因为您处于行选择模式.
你可以通过调整你的css选择器来依赖行(这样的事情)来解决这个问题:

.table-row-cell:selected .cell {
    -fx-effect: ...;
}
Run Code Online (Sandbox Code Playgroud)

与TableView 结合使用时:cell-selection,您可以使它更有用:row-selection:

.table-view:row-selection .table-row-cell:selected .cell, .table-view:cell-selection .cell:selected {
    -fx-effect: ...;
}
Run Code Online (Sandbox Code Playgroud)

将适用于选定的单元格,无论您的操作方式如何 TableViewSelectionModel