单击JavaFX上的行背景颜色

时间:2016-11-21 19:11:20

标签: javafx colors tableview

有没有机会在选定的行上编写TableView行颜色?我的意思是这样的:我有例如填充了电影的TableView,我想要一个特定的电影(行)来改变点击的颜色 - 绿色当它在商店 - 或 - 红色 - 当它不在商店时。通过查询到数据库的简单功能我们将知道它是否在商店,但我还需要一些能够改变所选行背景颜色的功能。是否有任何方法可以使用类似的代码?

1 个答案:

答案 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());
    }
});