2016-11-22 168 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