【问题标题】:Is this a Bug in my code or a problem with cellfactory这是我的代码中的错误还是 cellfactory 的问题
【发布时间】:2020-12-17 21:38:19
【问题描述】:
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。

【问题讨论】:

  • 错误在您的代码中。您需要在所有条件下将文本设置为完整,包括空单元格和截止日期超过四天的单元格。

标签: java user-interface javafx


【解决方案1】:

ListView 中的单元格会在需要时重复使用。因此,在您的情况下,您设置了一个带有红色填充的特定单元格,但是当同一个单元格被重复用于不同的 ToDoItems 实例时(因为您向下滚动或在列表中添加了一个新项目),并且那个新的 @987654323 @instance 不满足您更改填充颜色的任何条件,单元格将错误地保持其先前的填充颜色。

如果不满足示例中的任何条件,您需要确保回退到默认颜色:

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;
    }
});

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 2011-05-21
    • 1970-01-01
    • 2011-05-07
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多