2012-01-29 84 views
2

我已將此解決方案應用於JComboBox,以獲得鍵/值對的效果以顯示文本,但返回ID,如ID = 2,但文本爲「香蕉」。Java Swing的鍵值對JList

我現在需要將此實現爲JList,但是無法從返回的JList獲取對象,以便我可以檢索該值。

public class ComboItem { 

    private String value; 
    private String label; 

    public ComboItem(String value, String label) { 
     this.value = value; 
     this.label = label; 
    } 

    public String getValue() { 
     return this.value; 
    } 

    public String getLabel() { 
     return this.label; 
    } 

    @Override 
    public String toString() { 
     return label; 
    } 
} 


DefaultListModel listmodel = new DefaultListModel(); 
JList cAktkod = new JList(listmodel); 
int pos = cAktkod.getModel().getSize(); 

listmodel.add(pos, new ComboItem(resultSet.getString("MMCFI5"),resultSet.getString("CTTX40"))); 

但在這樣我就可以的getValue()這個階段,如果我做

cAktkod.getSelectedValue(); 

它返回一個對象,我不知道如何得到它給我的ComboItem對象,而不是

+3

爲什麼你不能只投出返回的對象? – mre 2012-01-29 18:31:49

回答

6

基本上JList不知道或在意列表中的對象的類型(即子類)。但是如果你把所有列入ComboItem的列表中,那麼你得到的對象將是一個ComboItem。您只需要將其轉換爲告訴編譯器它是什麼類型。

Object selectedObj = cAktkod.getSelectedValue(); 
if (selectedObj instanceof ComboItem) { 
    ComboItem selectedItem = (ComboItem) selectedObj; 
} 
else { 
    // something has gone wrong! 
} 
+0

您可以將任何類的混合插入DefaultListModel,因此檢查類型是有意義的。當然在這個例子中只添加了ComboItems,所以只返回ComboItems。 – brain 2012-01-29 18:41:09

5

mre概述了一個簡單的解決方案。如果您希望避免將對象轉換回基本類型,還有另一種方法。

  • 創建的ComboItem一個通用Vector
  • 添加的Vector
  • 每個項目使用Vector
  • 在選擇創建JList,然後獲得所選擇的指數叫Vector.elementAt(index)得到相應的對象。
+0

沒有JList在Java 7中「通用化」,這使得這不必要? – 2012-01-29 18:41:08

+0

@HovercraftFullOfEels可能。我前一陣子嘗試1.7,發現它不會運行我的DukeBox軟件,厭惡地卸載它。我決定一旦Oracle推出1.7 JRE自動更新(大概會解決大多數錯誤),我會再次審視它。 – 2012-01-29 18:43:51

4

您應該能夠使用你的清單,模型的通用版本,所以你使用的JList <的ComboItem >和DefaultListModel <的ComboItem >。這樣,您添加和取回的對象都是ComboItem類型。