卡在JavaFX ListView中

时间:2018-12-18 09:59:35

标签: java swing listview javafx factory

我正在尝试将基于Android的应用程序重写为JavaFX,并遇到一个问题。

问题的简要说明如下:

1)我具有根为abstract class Field的类层次结构,并且子类的数量为FieldCatFieldZebraFieldDog等,依此类推-每个此类都有其自己的类拥有足够独特的结构和视觉表示(以FXML的形式)

2)有ListView应该显示属于Field层次结构的对象的列表-存储在ObservableList<Field> listItems

3)现在,我需要将每个FieldWhatever对象作为ListView

中的单独行进行充气

声明

我无法使用JavaFX ListView控件(?!)

证明

创建ListView元素的唯一方法是提供CellFactory

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

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

Factory本身会接收单个参数ListView,因此它可以为ListCell的所有元素生成相同的ListView-换句话说,我无法根据基础{填充不同的UI元素{1}}个对象。

一开始我什至不敢相信-怎么可能?在Android中,我可以根据对象类型/层次结构等来膨胀任何类型的复杂性UI,但是在JavaFX中-不可能吗?相信我-我花了数小时试图修复它-没有用。

问题

  1. 我是对的(我真的很高兴听到我错了)
  2. 该怎么办?如何解决情况并放入/放置/充气 完全不同的对象/类/实体的列表/表列表?

1 个答案:

答案 0 :(得分:2)

广告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;
    }
}