1 回答
TA贡献1789条经验 获得超8个赞
内联样式比CSS样式表具有更高的优先级。因此,所选行的背景也将被覆盖。构造背景的方式要求您使用“指定”-fx-control-inner-background-alt和“-fx-control-inner-background代替”。
[...].setStyle("-fx-control-inner-background: khaki; -fx-control-inner-background-alt: khaki;")
但是,存在一个更严重的问题:
您可以从设置样式TableCell。由于TableView负责将项目分配给单元格,因此,如果您在不同的列中使用单元格类型,则完成的顺序是实现细节,会导致任意结果。即使仅在一列中使用这些单元格,也永远不会处理单元格为空的情况,因此即使是空单元格也可能仍包含新颜色。
行样式属于表行。
如果您使用PseudoClass和CSS样式表,那么您还将获得最大的灵活性。
例如
final PseudoClass one = PseudoClass.getPseudoClass("one");
tableView.setRowFactory(t -> new TableRow<Model>() {
private ChangeListener<Integer> listener = (o, oldValue, newValue) -> {
pseudoClassStateChanged(one, newValue == 1);
};
@Override
protected void updateItem(Model model, boolean empty) {
if (getItem() != null) {
getItem().myValueProperty().removeListener(listener);
}
super(model, empty);
if (empty || model == null) {
listener.changed(null, 0, -1);
} else {
model.myValueProperty().addListener(listener);
listener.changed(null, 0, model.getMyValue());
}
}
});
CSS样式表
.table-row-cell:one {
-fx-control-inner-background: khaki;
-fx-control-inner-background-alt: khaki;
}
此外,你应该使用类型参数,以避免转换到您的项目Integer,以String和回Integer(这应该由一个投来代替,如果它需要做这样的。在这种情况下,最好不要使用原始类型)。
final ObservableList<Integer> values = FXCollections.observableArrayList(0, 1);
column.setCellFactory((TableColumn<Model, Integer> p) -> {
ComboBoxTableCell<Model, Integer> cell = new ComboBoxTableCell<Model, Integer>(values) {
@Override
protected void updateItem(Integer item, boolean empty) {
...
}
};
return cell;
});
添加回答
举报