如何在JavaFX中动态更改listview中项目的背景

如何在JavaFX中动态更改listview中项目的背景,java,listview,javafx,colors,Java,Listview,Javafx,Colors,我正在编写一个程序,它将一组项放置在listview中。 然后检查是否在数据库中找到了这些项。如果在数据库中找不到该项,我想在listview中更改该项的背景。 我正在使用JavaFX来实现这个程序 如何执行此操作?您可以为ListView使用自定义单元格工厂,该工厂检查条件并将适当的css样式类应用于每个项/单元格 下面的代码显示了如何对具有String类型项的Listview执行此操作 listView.setCellFactory(new Callback<ListView

我正在编写一个程序,它将一组项放置在listview中。 然后检查是否在数据库中找到了这些项。如果在数据库中找不到该项,我想在listview中更改该项的背景。 我正在使用JavaFX来实现这个程序


如何执行此操作?

您可以为ListView使用自定义单元格工厂,该工厂检查条件并将适当的css样式类应用于每个项/单元格

下面的代码显示了如何对具有String类型项的Listview执行此操作

     listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>(){

        @Override
        public ListCell<String> call(ListView<String> p) {

            ListCell<String> cell = new ListCell<String>(){

                @Override
                protected void updateItem(String t, boolean bln) {
                    super.updateItem(t, bln);
                    if (t != null ) {
                        setText( t);

                        if (item_is_not_available){

                            if (!getStyleClass().contains("mystyleclass") {
                                getStyleClass().add("mystyleclass");
                            }

                        } else {
                            getStyleClass().remove("mystyleclass");
                        }
                    } else {
                        setText("");
                    }
                }

            };

            return cell;
        }
    });

您可以为ListView使用自定义单元格工厂来检查条件,并将适当的css样式类应用于每个项/单元格

下面的代码显示了如何对具有String类型项的Listview执行此操作

     listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>(){

        @Override
        public ListCell<String> call(ListView<String> p) {

            ListCell<String> cell = new ListCell<String>(){

                @Override
                protected void updateItem(String t, boolean bln) {
                    super.updateItem(t, bln);
                    if (t != null ) {
                        setText( t);

                        if (item_is_not_available){

                            if (!getStyleClass().contains("mystyleclass") {
                                getStyleClass().add("mystyleclass");
                            }

                        } else {
                            getStyleClass().remove("mystyleclass");
                        }
                    } else {
                        setText("");
                    }
                }

            };

            return cell;
        }
    });

请显示一些代码-理想情况下是a,其中包括列表和单元格工厂(如果有)中项目的类定义。请粘贴您正在描述的代码,并告诉我们您迄今为止尝试了什么。请显示一些代码-理想情况下是a,其中包括列表和单元格工厂(如果有)中项目的类定义。请,粘贴您正在描述的代码,并告诉我们您到目前为止尝试了什么。这充满了bug。您必须在
updateItem(…)
方法中处理项目为
null
的情况。如果单元格从可用项更新为不可用项,则还必须删除样式类,并且您需要确保不向同一单元格多次添加
“mystyleclass”
。我编辑了答案。至于“如果单元格从可用项更新为不可用项,则还必须删除样式类”,我假设该示例足以理解该概念,并适当地处理其他情况。但它实际上不起作用。在这个实现中,如果用户四处滚动,错误的单元格将具有给定的样式类。这一点您是对的。现在添加了缺少的部分,甚至试着运行它,它也能工作。因为OP想要改变背景,你也可以通过添加“mystyleclass”的定义来完成答案,说明它是什么样子。这里面充满了bug。您必须在
updateItem(…)
方法中处理项目为
null
的情况。如果单元格从可用项更新为不可用项,则还必须删除样式类,并且您需要确保不向同一单元格多次添加
“mystyleclass”
。我编辑了答案。至于“如果单元格从可用项更新为不可用项,则还必须删除样式类”,我假设该示例足以理解该概念,并适当地处理其他情况。但它实际上不起作用。在这个实现中,如果用户四处滚动,错误的单元格将具有给定的样式类。这一点您是对的。现在添加了缺少的部分,甚至尝试运行它,它也可以工作。由于OP想要更改背景,您也可以通过添加“mystyleclass”的定义来完成答案,说明它的外观。