Java Swing JList的键值对

Java Swing JList的键值对,java,swing,key,jlist,Java,Swing,Key,Jlist,我的JComboBox有这样一个解决方案,可以获得键/值对的效果,显示文本,但检索ID,比如ID=2,但文本是“香蕉” 我现在需要将其实现到JList,但是很难从返回的JList中获取对象,以便检索值 public class ComboItem { private String value; private String label; public ComboItem(String value, String label) { this.value

我的JComboBox有这样一个解决方案,可以获得键/值对的效果,显示文本,但检索ID,比如ID=2,但文本是“香蕉”

我现在需要将其实现到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")));
但在这个阶段,如果我这样做

cAktkod.getSelectedValue();

它返回一个对象,我不知道如何让它给我ComboItem对象,这样我就可以取而代之的是getValue()

基本上JList不知道或不关心列表中对象的类型(即子类)。但是,如果您在列表中输入的都是ComboItem,那么您输出的对象将是ComboItem。您只需要强制转换它来告诉编译器它是什么类型

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

mre概述了一个简单的解决方案。如果希望避免将对象强制转换回其基本类型,则有另一种方法

  • 创建
    组合项
    通用
    向量
  • 添加
    向量的每一项
  • 使用
    向量创建
    JList
  • 选择时,获取所选索引,然后调用
    Vector.elementAt(index)
    获取相应的对象

您应该能够使用列表和模型的通用版本,因此您应该使用JList和DefaultListModel。这样,您添加和返回的对象都是ComboItem类型。

为什么不能强制转换返回的对象?JList在Java 7中是否已被“泛化”使其不必要?@hovercraftfullofels。我不久前试过1.7,发现它不能运行我的DukeBox软件,我厌恶地卸载了它。我决定在Oracle推出1.7JRE自动更新(这可能会解决大部分bug)后再看一遍。您可以在DefaultListModel中插入任意混合类,这样检查类型就有意义了。当然,在给定的示例中,只添加ComboItems,因此只返回ComboItems。