我有一个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是整数。
答案 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)确实有效。