2016-11-11 66 views
0

我需要創建一堆JComboBoxes都一樣。我正在嘗試使用DefaultComboBoxModel來生成模型。但是,我還需要根據要包含在列表中的數據創建幾個不同的模型。因此我創建了一個我想用來生成模型的類。創建一個DefauitComboBoxModel類

public class ModelComboBox<T> { 

    public ModelComboBox(ArrayList<String> list_) { 
     DefaultComboBoxModel<String> model=new DefaultComboBoxModel<String>(); 
     for (String entry : list_) { 
      model.addElement(entry); 
     } 
    } 
} 

當我嘗試使用模型時,我得到一個ModelComboBox.ModelComboBox無法解析爲類型錯誤。

meatNames=new JComboBox<String>(new ModelComboBox.ModelComboBox<String>(meats)); 

有人可以幫助我告訴它什麼類型的ModelComboBox.ModelComboBox的語法?我在參數中嘗試了(DefaultComboBoxModel)的各種位置,但沒有嘗試過。 TIA。

回答

0

這裏有很多問題。

首先,ModelComboBox是一個頂級的類。調用其構造函數的語法與其他頂級類一樣,是new ModelComboBox<String>(),而不是new ModelComboBox.ModelComboBox<String>()

其次,這個類是一個泛型類,但它並沒有在任何地方使用它的泛型類型(T)。所以它絕對沒有理由是通用的。

第三,它的構造函數創建一個DefaultComboBoxModel,並將它賦值給一個局部變量。當構造函數完成時,DefaultComboBoxModel因此超出作用域,變爲符合GC的條件,因此無法在任何地方使用。

最後,將ModelComboBox的一個實例傳遞給JComboBox的構造函數。但JComboBox需要ComboBoxModel的一個實例,而不是ModelComboBox的一個實例。所以不能編譯。

你完全無視這個IMO。所有你需要的是一些輔助方法,允許採取List<String>,並從該列表中創建一個DefaultComboBoxModel:

public DefaultComboBoxModel<String> createComboBoxModel(List<String> list) { 
    return new DefaultComboBoxModel<String>(new Vector<>(list)); 
} 
+0

那麼這當然是容易得多。但是,當我創建你的幫助器方法時,我得到這個錯誤:DefaultComboBoxModel是一個原始類型。參考通用類型DefaultComboBoxModel 應參數化 –

+0

更正,這是一個警告不是錯誤。我可以忽略它,但有沒有辦法擺脫它?感謝您讓我走上正軌。 –

+0

看我的編輯。我只是忘了泛型類型。 –

0

JB Nizet的解釋是非常好,但我會修改它只是有點。

public ModelComboBox(ArrayList<String> list) { 
    setModel(new DefaultComboBoxModel<String>(list.toArray()); 
} 

沒有必要創建一個VectorArrayList實現List接口,這保證了.toArray()方法。

支持模式下的所有Swing組件有setModel(...)函數,該函數模型的類型Component支持。

+0

這不會編譯。 toArray()返回一個Object [],但構造函數需要一個String []。你需要使用'list.toArray(new String [list.size()])'。 –

+0

@JBNizet我從內存中鍵入很多次,所以不,我沒有通過編譯器運行它。我也相信你可以使用list.toArray ()。但是 –

+0

這不是有效的Java,並且toArray()不是一般的方法。 –