Застрял с JavaFX ListView - PullRequest
       9

Застрял с JavaFX ListView

0 голосов
/ 18 декабря 2018

Я пытаюсь переписать свое приложение для Android в JavaFX и застрял с одной проблемой.

Краткое описание проблемы выглядит следующим образом:

1) У меня есть иерархия классов с корнемabstract class Field и количество дочерних классов, таких как FieldCat, FieldZebra, FieldDog и т. Д. - каждый из этих классов имеет свою собственную достаточно уникальную структуру и визуальное представление (в виде FXML)

2) Есть ListView, который должен показывать список объектов, принадлежащих иерархии Field - хранится в ObservableList<Field> listItems

3) И теперь мне нужно раздуть каждый из моих FieldWhatever объектов как отдельную строку в ListView

Заявление

Я не могу сделать это с помощью JavaFX ListView control (?!)

Proof

Единственный способ создать элемент ListView - предоставить CellFactory:

public class FieldsListCellFactory<T extends Field> implements Callback<ListView<T>, ListCell<T>> {

    @Override
    public ListCell<T> call(ListView<T> listView) {
         //blah-blah
    }
}

Фабрика сама получает один параметр ListView, поэтому может генерировать тот же ListCell длявсе элементы ListView - другими словами, я не могу заполнить различные элементы пользовательского интерфейса в зависимости от базового FieldWhatever объект.

С самого начала я даже не мог в это поверить - как это возможно?В Android я мог раздуть любой вид сложности пользовательского интерфейса в зависимости от типа объекта / иерархии и так далее, но в JavaFX - невозможно?Поверьте мне - я потратил часы, пытаясь это исправить - бесполезно.

Вопросы

  1. Я прав (я был бы очень рад услышать, что я неправ)
  2. Что делать с?Как разрешить ситуацию и поставить / разместить / надуть в списке List / Table совершенно разные объекты / классы / сущности?

1 Ответ

0 голосов
/ 18 декабря 2018

Объявление 1 Вы не правы.

Объявление 2 Вот код:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.stage.Stage;

public class ListViewApp extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        ListView<Animal> listview = new ListView<>(FXCollections.observableArrayList(new Dog(1, "John"), new Cat(2, "Fluffy")));
        listview.setCellFactory(param -> new ListCell<Animal>() {

            @Override
            protected void updateItem(Animal animal, boolean empty) {
                super.updateItem(animal, empty);
                if (animal != null) {
                    setText(animal.getText());
                }
            }
        });

        stage.setScene(new Scene(listview));
        stage.show();
    }
}

class Animal {
    protected final int id;

    public Animal(int id) {
        this.id = id;
    }

    protected String getText() {
        return "";
    }
}

class Dog extends Animal {
    private final String owner;

    public Dog(int id, String owner) {
        super(id);
        this.owner = owner;
    }

    @Override
    protected String getText() {
        return "DOG id=" + id + ", owner=" + owner;
    }
}

class Cat extends Animal {
    private final String name;

    public Cat(int id, String name) {
        super(id);
        this.name = name;
    }

    @Override
    protected String getText() {
        return "CAT id=" + id + ", name=" + name;
    }
}
...