有没有机会在选定的行上编写TableView行颜色?我的意思是这样的:我有例如填充了电影的TableView,我想要一个特定的电影(行)来改变点击的颜色 - 绿色当它在商店 - 或 - 红色 - 当它不在商店时。通过查询到数据库的简单功能我们将知道它是否在商店,但我还需要一些能够改变所选行背景颜色的功能。是否有任何方法可以使用类似的代码?
答案 0 :(得分:2)
您可以采取以下措施:
TableView<Movie> table = ... ;
PseudoClass outOfStockPseudoClass = PseudoClass.getPseudoClass("out-of-stock");
table.setRowFactory(tv -> {
TableRow<Movie> row = new TableRow<>();
row.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
boolean outOfStock = checkIfOutOfStock(row.getItem()) ;
row.pseudoClassStateChanged(outOfStockPseudoClass, outOfStock);
}
});
row.itemProperty().addListener((obs, oldMovie, newMovie) -> {
if (row.isSelected()) {
boolean outOfStock = checkIfOutOfStock(newMovie) ;
row.pseudoClassStateChanged(outOfStockPseudoClass, outOfStock);
}
});
return row ;
});
然后在外部CSS文件中执行
.table-row-cell {
-fx-selection-bar: /* color for in-stock selected row */ ;
}
.table-row-cell:out-of-stock {
-fx-selection-bar: /* color for out-of-stock selected row */;
}
如果您在初始化数据库中的数据时可以检查影片是否有库存,则可以简化行工厂:
table.setRowFactory(tv -> new TableRow<Movie>() {
@Override
protected void updateItem(Movie item, boolean empty) {
super.updateItem(item, empty);
pseudoClassStateChanged(outOfStockPseudoClass,
item!=null && item.isOutOfStock());
}
});