我正在尝试将基于 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 代码如下:
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/