单击JavaFX时的行背景色

单击JavaFX时的行背景色,javafx,colors,tableview,Javafx,Colors,Tableview,是否有机会对所选行的TableView行颜色进行编码?我的意思是这样的:例如,我有一个充满电影的TableView,我想让一个特定的电影(行)在商店里时,点击改变颜色为绿色,或者在不在商店里时,点击改变颜色为红色。我们将知道它是否在商店或不通过简单的功能与查询数据库,但我还需要一些功能,将能够改变选定的行背景颜色。有没有办法让代码变成这样的东西?您可以按照以下方式做一些事情: TableView<Movie> table = ... ; PseudoClass outOfStock

是否有机会对所选行的TableView行颜色进行编码?我的意思是这样的:例如,我有一个充满电影的TableView,我想让一个特定的电影(行)在商店里时,点击改变颜色为绿色,或者在不在商店里时,点击改变颜色为红色。我们将知道它是否在商店或不通过简单的功能与查询数据库,但我还需要一些功能,将能够改变选定的行背景颜色。有没有办法让代码变成这样的东西?

您可以按照以下方式做一些事情:

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 ;
});
如果可以在初始化数据库中的数据时检查电影是否有库存,则可以简化行工厂:

table.setRowFactory(tv -> new TableRow<Movie>() {
    @Override
    protected void updateItem(Movie item, boolean empty) {
        super.updateItem(item, empty);
        pseudoClassStateChanged(outOfStockPseudoClass, 
            item!=null && item.isOutOfStock());
    }
});
table.setRowFactory(tv->new TableRow(){
@凌驾
受保护的void updateItem(电影项,布尔值为空){
super.updateItem(项,空);
pseudoClassStateChanged(outOfStockPseudoClass,
item!=null&&item.isOutOfStock());
}
});

您可以按照以下方式进行操作:

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 ;
});
如果可以在初始化数据库中的数据时检查电影是否有库存,则可以简化行工厂:

table.setRowFactory(tv -> new TableRow<Movie>() {
    @Override
    protected void updateItem(Movie item, boolean empty) {
        super.updateItem(item, empty);
        pseudoClassStateChanged(outOfStockPseudoClass, 
            item!=null && item.isOutOfStock());
    }
});
table.setRowFactory(tv->new TableRow(){
@凌驾
受保护的void updateItem(电影项,布尔值为空){
super.updateItem(项,空);
pseudoClassStateChanged(outOfStockPseudoClass,
item!=null&&item.isOutOfStock());
}
});

hmm这可能有效,但颜色没有改变:/external CSS文件是standard application.CSS吗?我是否必须将其链接到工作应用程序或其他什么?我的意思是,我可以不使用伪类,比如这里:是的,在tableview初始化或刷新时,我不会进行查询检查电影是否有库存?嗯,这可能有效,但颜色没有变化:/external CSS file是standard application.CSS?我是否必须将其链接到工作应用程序或其他什么?我的意思是,我可以不用伪类来完成它吗,比如这里:是的,在tableview初始化或刷新时,我不会进行查询检查,看电影是否有存货?