Java从Listbox中选择项目时不设置对象

Jav*_*ner 6 java zk jooq

我使用的Java,JooqZK7我的应用程序,但我得到一个问题,看到我的情况我有列表框其中显示模型中的所有记录我有当点击它我在添加新元素的添加按钮列表框这样的事情

    private ListModelList<Record> adminListModelListSort;
    protected ListModelList<Record> adminListModelList;

    ValidWorkRecord new_record1 =  new ValidWorkRecord();
    adminListModelList.add(new_record1);
    adminNewListModelList.add(new_record1);
Run Code Online (Sandbox Code Playgroud)

列表框添加项目没有任何问题,但当我收回所选项目我得到单个记录和选择项目是这样的

WorkCode|WorkDesc|StatCanWorkType|StampDate|StampUser|AccessCode|WorkDesc2|Comments|ActiveFlag|
+--------+--------+---------------+---------+---------+----------+---------+--------+----------+
| *{null}|*{null} |*{null}        |*{null}  |*{null}  |   *{null}|*{null}  |*{null} |*{null}   |
Run Code Online (Sandbox Code Playgroud)

所以我说在5个新项目列表框和其显示加入5项,但是当我想获得它的SelectedItem添加显示只有1项,如果我做的新增项目的任何变化则显示为选择该项目.注: -第一时间新增项目的内容为空值只.你知道java Set的问题吗?

private Set  selectedListItem;//get,set method
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试下面的代码,一切运行良好ZUL页面

    <?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>
Run Code Online (Sandbox Code Playgroud)

查看型号代码

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;
  }

 }
}
Run Code Online (Sandbox Code Playgroud)

为什么Set在两个地方表现两种方式?

Jof*_*rey 2

ASet不能包含重复项,但 List 可以。如果返回 true (或两者都为),则2 个对象o1o2被视为重复项。如果您尝试添加重复项,它将被忽略(将返回 false)。o1.equals(o2)nulladd()

如果您总是以这种方式添加项目:

ValidWorkRecord new_record1 =  new ValidWorkRecord();
selectedListItem.add(new_record1);
Run Code Online (Sandbox Code Playgroud)

那么它们有可能被认为是相等的,具体取决于您的equals()方法。

事实上,在不进行其他修改的情况下调用构造函数将以相同的方式初始化所有项目。如果您进行了覆盖equals(),使其不再基于指针值,那么您应该检查 返回值add(...)以确保您的项目已添加。


更新:据我了解,您似乎无法控制该add(...)语句,因此您无法检查其返回值。但是,既然我看到了您的数据类,您还没有覆盖,equals()所以这不应该是问题。

但是,您可能不应该使用原始类型 Set,而Set<Data>应该使用原始类型。

另外,尝试在 setter 中进行跟踪setSelectitems()以检查该方法是否至少被调用。