gpt4 book ai didi

具有泛型类的 JavaFX 自定义 ComboBox

转载 作者:行者123 更新时间:2023-11-30 07:02:04 25 4
gpt4 key购买 nike

我有两种扩展类 X 的类

public class A extends X

public class B extends X

在我的 JavaFX 应用程序中,需要有一个组合框。此组合框是使用类 A 或 B 构造的,并使用该类各自的 toString() 方法进行填充。减少代码重复。

我正在尝试修改当前生成组合框的方法,以便它允许 A 或 B 类型的 ObservableList。

protected ComboBox<? extends X> getComboBox(ObservableList<? extends X> list){
ComboBox<? extends X> comboBox = new ComboBox<>();
comboBox.setItems(list);
comboBox.setCellFactory(new Callback<ListView<? extends X>, ListCell<? extends X>>() {
@Override
public ListCell<Controller> call(ListView<Controller> param) {

return new ListCell<? extends X>(){
@Override
public void updateItem(Class<? extends X> content, boolean empty){
super.updateItem(content, empty);
if(!empty) {
setText(content.toString());
} else {
setText(null);
}
}
};
}
});
return comboBox;
}

由于这两个类都有一个父类(super class),是否有可能实现这样的目标(并且可能但不是本质上,将其作为原始类类型返回)

@SillyFly - 我使用 Reflections 依赖项检索列表。它返回特定类型(即 A)的所有类

public ObservableList<A> getAList() {
Reflections reflection = new Reflections("com.classes.aClasses");
ObservableList<A> classesList = FXCollections.observableArrayList();
for (Class<? extends A> thisClass : reflection.getSubTypesOf(A.class)) {
try {
classesList.add(thisClass.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
return classesList;
}

最佳答案

我很确定默认值 ListCell实现使用 toString渲染项目,因此设置单元工厂可能是多余的。

至于你的问题 - 问题是 ComboBox<T>需要它items属性(property)为ObservableList<T> 。由于您正在使用 generic wildcard作为类型参数,编译器无法知道这是否是同一类型。

您需要做的是给该方法一个 generic type parameter :

protected <T extends X> ComboBox<T> getComboBox(ObservableList<T> list){
ComboBox<T> comboBox = new ComboBox<>();
comboBox.setItems(list);
// Setting a cell factory is probably redundant if you're only using toString...
return comboBox;
}

请注意,我们定义了一个类型参数 T并强制它成为扩展 X 的类型。从此以后所有泛型变量都使用此类型参数,因此编译器可以知道它全部匹配。

关于具有泛型类的 JavaFX 自定义 ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com