Cell Factory是否支持两种不同类型的对象?

时间:2018-06-23 14:34:14

标签: javafx

我正在用两种不同类型的对象填充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对象(香蕉和葡萄柚)。如何使用同一事件重命名包含葡萄柚的细胞?

1 个答案:

答案 0 :(得分:0)

最好将返回名称的方法移动到超类型,并对所有名称使用相同的方法。将类型名称包含在属性名称中只会导致更长的标识符,而没有任何其他好处(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);
    }
});