我正在尝试将基于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
}
}
Factory本身会接收单个参数ListView
,因此它可以为ListCell
的所有元素生成相同的ListView
-换句话说,我无法根据基础{填充不同的UI元素{1}}个对象。
一开始我什至不敢相信-怎么可能?在Android中,我可以根据对象类型/层次结构等来膨胀任何类型的复杂性UI,但是在JavaFX中-不可能吗?相信我-我花了数小时试图修复它-没有用。
问题
答案 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;
}
}