Поддерживает ли Cell Factory два разных типа объектов? - PullRequest
0 голосов
/ 23 июня 2018

Я заполняю свой 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 голосов
/ 23 июня 2018

Лучше было бы переместить метод, возвращающий имя в супертип, и использовать один и тот же метод для всех имен. Включение имени типа в имя свойства просто приводит к более длинным идентификаторам без каких-либо дополнительных преимуществ (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);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...