这是我的代码中的错误还是cellfactory的问题

pw9qyyiw  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(272)
todoitemsListview.setCellFactory(new Callback<ListView<ToDoItems>, ListCell<ToDoItems>>() {
        @Override
        public ListCell<ToDoItems> call(ListView<ToDoItems> toDoItemsListView) {
            ListCell<ToDoItems> cell= new ListCell<ToDoItems>(){
                @Override
                protected void updateItem(ToDoItems items, boolean empty) {
                    super.updateItem(items, empty);
                    if(empty){
                        setText(null);
                    }else {
                        setText(items.getItemName());
                        if (items.getDeadline().equals(LocalDate.now())){
                            System.out.println(items.getDeadline().toString());
                            System.out.println(items.getItemName());
                            setTextFill(Color.RED);
                        }else if (items.getDeadline().equals(LocalDate.now().plusDays(1))){
                            System.out.println(items.getDeadline().toString());
                            System.out.println(items.getItemName());
                            setTextFill(Color.BLUE);
                        }else if (items.getDeadline().equals(LocalDate.now().plusDays(2))){
                            System.out.println(items.getDeadline().toString());
                            System.out.println(items.getItemName());
                            setTextFill(Color.GREEN);
                        }else if(items.getDeadline().isBefore(LocalDate.now())){
                            System.out.println(items.getDeadline().toString());
                            System.out.println(items.getItemName());
                            setTextFill(Color.GREY);
                        }
                    }
                }
            };
            return cell;
        }
    });

我在listview中使用了一个cellfactory,根据文本的截止日期将文本颜色设置为不同的值。但是当我向列表中添加新项时,不满足if-else条件的项也会高亮显示。
这是基于observabellist的基本todo应用程序的一部分,其中todoitems类有三个属性:itemname、itemdesription和deadline。

u7up0aaq

u7up0aaq1#

a中的细胞 ListView 在需要时重复使用。所以在您的例子中,您设置了一个带有红色填充的特定单元格,但是当同一单元格被重新用于不同的 ToDoItems 示例(因为您向下滚动或在列表中添加了一个新项),并且 ToDoItems 示例不会填充任何更改填充颜色的条件,单元格将错误地保留其以前的填充颜色。
如果不满足示例中的任何条件,则需要确保返回到默认颜色:

todoitemsListview.setCellFactory(new Callback<ListView<ToDoItems>, ListCell<ToDoItems>>() {
    @Override
    public ListCell<ToDoItems> call(ListView<ToDoItems> toDoItemsListView) {
        ListCell<ToDoItems> cell = new ListCell<ToDoItems>() {
            @Override
            protected void updateItem(ToDoItems items, boolean empty) {
                super.updateItem(items, empty);
                if (empty) {
                    setText(null);
                    setTextFill(Color.BLACK);
                } else {
                    setText(items.getItemName());
                    if (items.getDeadline().equals(LocalDate.now())) {
                        System.out.println(items.getDeadline().toString());
                        System.out.println(items.getItemName());
                        setTextFill(Color.RED);
                    } else if (items.getDeadline().equals(LocalDate.now().plusDays(1))) {
                        System.out.println(items.getDeadline().toString());
                        System.out.println(items.getItemName());
                        setTextFill(Color.BLUE);
                    } else if (items.getDeadline().equals(LocalDate.now().plusDays(2))) {
                        System.out.println(items.getDeadline().toString());
                        System.out.println(items.getItemName());
                        setTextFill(Color.GREEN);
                    } else if (items.getDeadline().isBefore(LocalDate.now())) {
                        System.out.println(items.getDeadline().toString());
                        System.out.println(items.getItemName());
                        setTextFill(Color.GREY);
                    } else {
                        setTextFill(Color.BLACK);
                    }
                }
            }
        };
        return cell;
    }
});

相关问题