2012-01-29 81 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类型。