2016-11-22 126 views
1

JavaFX的自定义组合框我有两种类型的延伸级X与泛型类

public class A extends X 

public class B extends X 

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

我想修改我当前的方法产生下拉框中,这样,它将使A型的ObservableList或B.

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

由于两个班有一个父类,是有可能实现这样的事情(可能,但不是本质上,返回它的原始类类型)

@SillyFly - 我使用反射依赖关系检索列表。它返回一个特定类型的所有类(即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; 
} 
+0

什么是“输入”?这是基类(你以前称为'X')吗? – Itai

+0

更正了此@sillyfly – Eunanibus

回答

1

我敢肯定,默认ListCell实现使用toString渲染项目,所以设置单元格工厂可能是多余的。

至于你的问题 - 问题是ComboBox<T>需要它的items财产是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一个类型。所有通用变量此后都会使用此类型参数,因此编译器可以知道所有匹配项。

+0

了解冗余方面。我认为我出于不同的原因早些时候实现了这一点,但现在没有任何意义。 然而,返回列表(也被插入此法)方法: 公共ObservableList getAList() - 当我把这个后,我得到的错误ObservableList 不能应用于ObservableList Eunanibus

+0

请添加其他方法以及如何对每个原始问题进行调用 - 很难遵循或知道哪里出了问题,通过一个完整的示例更容易理解。 – Itai

+0

我已将这添加到原始问题中。我使用反射包,因为我需要添加某个包的每个类。例如,在com.animals包中,我会添加dog.class,cat.class,rabbit.class - 这是我的意图,因为我希望在此包中添加每个类作为选项。 – Eunanibus