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

时间:2017-09-02 18:02:50

标签: java jcombobox

我有一个JComboBox,其中填充了自定义类DisplayValueModel的对象。

班级:

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是整数。

3 个答案:

答案 0 :(得分:1)

序言:请尊重Java命名约定。您的代码很难阅读,因为您没有。

那就是说,这里是setSelectedItem()的javadoc所说的:

  

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

     

如果anObject不在列表中且组合框不可编辑,则不会更改当前选择。

这应该是显而易见的,但无论如何javadoc都说:如果元素在列表中不均匀,你就不可能选择一个元素。

因此,为了让以下代码选择一些东西:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我使用向导覆盖equals()和hashCode()方法(参见JB Nizet的回答/评论),结果如下:

@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)确实有效。