java - 陷入 JavaFX ListView 困境

标签 java swing listview javafx factory

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

问题的简要说明如下:

1) 我有根为 abstract class Field 的类层次结构以及子类的数量,如 FieldCat , FieldZebra , FieldDog等等 - 每个类都有自己独特的结构和视觉表示(以 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
    }
}

工厂接收单个参数ListView本身,因此它可以生成相同的 ListCell对于 ListView 的所有元素- 换句话说,我无法根据底层 FieldWhatever 填充不同的 UI 元素对象。

一开始我什至不敢相信——这怎么可能?在 Android 中,我可以根据对象类型/层次结构等增加任何类型的复杂性 UI,但在 JavaFX 中 - 不可能吗?相信我 - 我花了几个小时试图修复它 - 毫无用处。

问题

  1. 我是对的吗(我很高兴听到我错了)
  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;
    }
}

关于java - 陷入 JavaFX ListView 困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53830518/

相关文章:

java - 如何在 Tab 键时选择 JTextField 中的文本

java - Spring 的随机 Kerberos 验证错误

java - Java 中的领域驱动设计 - 将所有原语转换为值对象?

java - Spring hash Map 中有多个值的 Map

java - 将行添加到 AbstractTableModel 的顶部

java - 带键盘导航的非 GPL Swing 日期选择器?

android - 创建 ListView 的共享首选项

c++ - QListView selectionModel 不发送 selectionChanged 信号

java - 滚动 listView 时 ListView 项目的背景变得困惑

java - 在 JavaFX 中使标签占据 HBox 上的所有可用空间