如何使用Java中的DisplayValueModel以编程方式设置Jcombobox的SelectEdItem

如何使用Java中的DisplayValueModel以编程方式设置Jcombobox的SelectEdItem,java,jcombobox,Java,Jcombobox,我用自定义类DisplayValueModel的对象填充了一个JComboBox 班级: public class DisplayValueModel { public Object displayMember; public Object valueMember; public DisplayValueModel(Object display, Object value) { displayMember = display; value

我用自定义类DisplayValueModel的对象填充了一个JComboBox

班级:

public class DisplayValueModel {
    public Object displayMember;
    public Object valueMember;

    public DisplayValueModel(Object display, Object value) {
        displayMember = display;
        valueMember = value;
    }

    public String toString() {
        return displayMember.toString();
    }
}
填充组合框的代码:

while (rs.next()) {
    id = rs.getInt("ID");
    Author = rs.getString("FullName");
    DisplayValueModel cb = new DisplayValueModel(Author,id);
    MainAuthor.addItem(cb);
}
但以下方法不起作用:

DisplayValueModel cb = new DisplayValueModel("Harlan Coben" ,1);
MainAuthor.setSelectedItem(cb);
那么,如何设置组合框中的项目?理想情况下,我希望能够仅使用id进行设置,如:

MainAuthor.setSelectedItem(id)

其中id是一个整数。

序言:请,请,请尊重Java命名约定。你的代码很难阅读,因为你不是

也就是说,setSelectedItem()的javadoc是这样说的:

将组合框显示区域中的选定项设置为参数中的对象。如果列表中有一个对象,则显示区域将显示一个选定的对象

如果列表中没有对象且组合框不可编辑,则不会更改当前选择

这应该是显而易见的,但javadoc还是这么说的:如果元素不在列表中,就不可能选择该元素

因此,为了让下面的代码选择一些内容:

DisplayValueModel cb = new DisplayValueModel("Harlan Coben", 1);
mainAuthor.setSelectedItem(cb);

然后,
cb
必须等于列表中的一个元素。Java中的相等由Object.equals()方法定义。因此,要么重写DisplayValueModel中的equals()(和hashCode()),要么在组合框中找到您想要选择的ID的元素,然后用找到的元素调用setSelectedItem。

通常,您不会将数据只提供给视图,也不会将其保留在日期模型中。因此,在您的情况下,您只能通过查看视图组合框来访问列表。那不是好的风格


将列表保存在模型中,meeans不会直接将列表提供给combobox,而是将其存储到数据模型中的任何变量中,然后用此列表填充combobox。然后,您可以通过搜索displayMember或displayValue始终访问它并获取每个项目的索引。

我使用向导覆盖equals()和hashCode()方法(请参阅JB Niset的答案/注释),结果生成以下代码:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;

    result = prime * result + ((valueMember == null) ? 0 : valueMember.hashCode());
    result = prime * result + ((displayMember == null) ? 0 : displayMember.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    DisplayValueModel other = (DisplayValueModel) obj;
    if (displayMember == null) {
        if (other.displayMember != null)
            return false;
    } else if (!displayMember.equals(other.displayMember))
        return false;
    if (valueMember == null) {
        if (other.valueMember != null)
            return false;
    } else if (!valueMember.equals(other.valueMember))
        return false;
    return true;
}
这些方法被添加到DisplayValueModel类中。
现在setSelectedItem(cb)确实起作用了。

因此,如果我理解正确,我的代码没有问题,因为我在这里创建的cb元素在列表中的方式完全相同。。。但是,当我想让setSelectedItem只处理一个ID时,我只需要重写equals()和hashCode()方法?我觉得这很奇怪,可能是设计错误的标志,你尝试选择了一个不在列表中的项。但是,是的,你可以覆盖equals()和hashCode()。你能举个例子说明如何覆盖这些方法吗?谷歌是你的朋友。javadoc是你的朋友。你的IDE是你的朋友。所有IDE都有覆盖equals()和hashCode()的向导。