首页 > 解决方案 > Cell Factory 是否支持两种不同类型的对象?

问题描述

我用两种不同类型的对象填充我的 ListView,我想重命名 ListView 中的所有项目。我正在使用以下代码重命名包含来自特定类型对象的项目的所有单元格。

public void listViewSetCellFactory() {
    listView.setCellFactory(lv -> new ListCell<Banana>() {
        @Override
        public void updateItem(Banana item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
            } else {
                String text = item.getBananaName();
                setText(text);

            }
        }
    });
}

但是由于我的 ListView 包含两种不同类型的 ob 对象(香蕉和葡萄柚)。如何使用相同的事件重命名包含葡萄柚的单元格?

标签: javafx

解决方案


最好将返回名称的方法移动到超类型,并对所有名称使用相同的方法。在属性名称中包含类型名称只会导致更长的标识符而没有任何额外的好处(banana.getName()就像 一样容易理解banana.getBananaName(),甚至可能更好)。

这将允许您以相同的方式创建ListView<Fruit>和处理项目:

listView.setCellFactory(lv -> new ListCell<Fruit>() {
    @Override
    public void updateItem(Fruit item, boolean empty) {
        super.updateItem(item, empty);

        setText(empty ? null : item.getName());
    }
});

如果你不能做到这一点,你必须吞下苦涩的药丸并使用它instanceof来确定物品的类型并相应地处理元素:

listView.setCellFactory(lv -> new ListCell<Object>() {
    @Override
    public void updateItem(Object item, boolean empty) {
        super.updateItem(item, empty);
        String text;
        if (empty) {
            text = null;
        } else if (item instanceof Banana) {
            text = ((Banana) item).getBananaName();
        } else {
            text = ((Grapefruit) item).getGrapefruitName();
        }

        setText(text);
    }
});

推荐阅读