我正在为我的应用程序使用 Java , Jooq 和 Zk7 ,但我遇到一个问题,请参阅我的方案 我有列表框,它显示了模型中的所有记录i点击它时有一个添加按钮我在列表框中添加了这样的新元素
private ListModelList<Record> adminListModelListSort;
protected ListModelList<Record> adminListModelList;
ValidWorkRecord new_record1 = new ValidWorkRecord();
adminListModelList.add(new_record1);
adminNewListModelList.add(new_record1);
列表框添加项目没有任何问题,但当我收回所选项目时,我获得单一记录 选择项目是这样的
WorkCode|WorkDesc|StatCanWorkType|StampDate|StampUser|AccessCode|WorkDesc2|Comments|ActiveFlag|
+--------+--------+---------------+---------+---------+----------+---------+--------+----------+
| *{null}|*{null} |*{null} |*{null} |*{null} | *{null}|*{null} |*{null} |*{null} |
所以我在列表框中添加了5个新项目,并显示了添加了5个项目,但是当我尝试获取selectitem时,如果我在新添加的项目中进行任何更改,则仅显示1个项目它将该项目显示为已选中。 注意: - 第一次新添加的项目内容仅为空值。 你知道java 设置
的问题是什么private Set selectedListItem;//get,set method
但是当我尝试下面的代码时,一切正常 ZUL Page
<?page title="new page title" contentType="text/html;charset=UTF-8"?>
<zk>
<window title="new page title" border="normal" id="inp"
viewModel="@id('vm') @init('test.MyListbox')" apply="org.zkoss.bind.BindComposer" >
<button label="AddItem" onClick="@command('addNewItem')" ></button>
<listbox model="@bind(vm.dataList)" selectedItems="@bind(vm.selectitems)" multiple="true" checkmark="true">
<listhead>
<listheader value="A"></listheader>
<listheader value="B"></listheader>
<listheader value="C"></listheader>
</listhead>
<template name="model" var="mymodel">
<listitem>
<listcell>
<textbox value="@bind(mymodel.a)" />
</listcell>
<listcell>
<label value="@bind(mymodel.b)" />
</listcell>
<listcell>
<label value="@bind(mymodel.c)" />
</listcell>
</listitem>
</template>
</listbox>
</window>
</zk>
查看型号代码
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Component;
public class MyListbox {
private List<Data> dataList;
private Set selectitems;
@AfterCompose
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
try {
dataList = new ArrayList<Data>();
Data data;
data = new Data("a1", "b1", "c1");
dataList.add(data);
data = new Data("a2", "b2", "c2");
dataList.add(data);
data = new Data("a3", "b3", "c3");
dataList.add(data);
} catch (Exception e) {
}
}
public Set getSelectitems() {
return selectitems;
}
public void setSelectitems(Set selectitems) {
this.selectitems = selectitems;
}
@Command
@NotifyChange("dataList")
public void addNewItem(){
Data data = new Data(null, null, null);
dataList.add(data);
if(selectitems != null)
System.out.println(selectitems.size());
}
public List<Data> getDataList() {
return dataList;
}
public void setDataList(List<Data> dataList) {
this.dataList = dataList;
}
public class Data {
String a;
String b;
String c;
public String getA() {
return a;
}
public String getB() {
return b;
}
public String getC() {
return c;
}
public void setA(String a) {
this.a = a;
}
public void setB(String b) {
this.b = b;
}
public void setC(String c) {
this.c = c;
}
public Data(String a, String b, String c) {
super();
this.a = a;
this.b = b;
this.c = c;
}
}
}
为什么Set在两个地方表现两种方式?
答案 0 :(得分:2)
A Set
cannot contain duplicates,但是List可以。如果o1
返回true(或两者都是o2
),则认为2个对象o1.equals(o2)
和null
是重复的。如果您尝试添加重复项,则会被忽略(add()
将返回false)。
如果您总是这样添加商品:
ValidWorkRecord new_record1 = new ValidWorkRecord();
selectedListItem.add(new_record1);
然后有可能认为它们是平等的,具体取决于您的equals()
方法。
实际上,在没有其他修改的情况下调用构造函数会以相同的方式初始化所有项目。如果您覆盖equals()
以使其不再基于指针值,那么您应该检查add(...)
的返回值,以确保添加了项目。
更新:据我所知,您似乎无法控制add(...)
语句,因此您无法检查其返回值。但是,现在我看到了你的数据类,你没有覆盖equals()
所以这不应该是问题。
但是,您可能不应使用原始类型 Set
,而应使用Set<Data>
。
此外,尝试在您的setter setSelectitems()
中设置跟踪,以检查该方法是否至少被调用。
答案 1 :(得分:0)
使用List for selectedListItems而不是Set。 Listbox可以正常使用5个新项目,因为Listitem对象放在List中。所以它们可以被5个列表项复制。但是只有一个数据对象添加到选定的集合中。希望这有帮助。