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

How to setSelectedItem of Jcombobox Programmatically with a DisplayValueModel in Java

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

Class:

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 是这样说的:

Sets the selected item in the combo box display area to the object in the argument. If anObject is in the list, the display area shows anObject selected.

If anObject is not in the list and the combo box is uneditable, it will not change the current selection.

这应该是显而易见的,但 javadoc 还是这么说了:如果元素甚至不在列表中,您就不可能对元素进行 selected。

所以,为了让下面的代码能够select一些东西:

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

cb 必须等于列表中的元素之一。 Java 中的相等性由 Object.equals() 方法定义。因此,要么覆盖 DisplayValueModel 中的 equals()(和 hashCode()),要么简单地 在组合框中找到 具有您想要 select 的 ID 的元素,然后使用找到的元素调用 setSelectedItem。

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

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

我使用向导覆盖了 equals() 和 hashCode() 方法(参见 JB Nizet 的 answer/comment),这导致了以下代码:

@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 class。 现在 setSelectedItem(cb) 确实起作用了。