-
FEATURED COMPONENTS
First time here? Check out the FAQ!
<?xml version="1.0" encoding="UTF-8"?>
<!--
Z60-Listbox-ListModelArray-Multiple-noROD.zul
Purpose:
Description:
History:
Tue Jan 10 10:01:05 TST 2012, Created by benbai
Copyright (C) 2012 Potix Corporation. All Rights Reserved.
-->
<zk>
<zscript>
<![CDATA[
import models.*;
ListModelArray model = ListModelArrays.getModel(ListModelArrays.MULTIPLE);
ListModelArray model2 = ListModelArrays.getModel(ListModelArrays.MULTIPLE_AND_CLONEABLE);
int cnt = 0;
int elemcnt = 0;
public void checkEqualSelection (String idOne, String idTwo, Label msg) {
Listbox lbOne = (Listbox)msg.getPage().getFellow(idOne);
Listbox lbTwo = (Listbox)msg.getPage().getFellow(idTwo);
Set s1 = lbOne.getModel().getSelection();
Set s2 = lbTwo.getModel().getSelection();
boolean matched = false;
for (Object o : s1) {
for (Object o2 : s2) {
System.out.println(o);
System.out.println(o2);
if (o.equals(o2)) {
matched = true;
break;
}
}
if (!matched) {
msg.setValue("false");
return;
}
matched = false;
}
msg.setValue("true");
}
public void showSelection (String idOne, Label msg) {
Listbox lbOne = (Listbox)msg.getPage().getFellow(idOne);
Set s1 = lbOne.getModel().getSelection();
StringBuilder sb = new StringBuilder("");
boolean matched = false;
for (Object o : s1) {
sb.append(o);
}
msg.setValue(sb.toString());
}
]]></zscript>
<div>
<div>1. There are 3 Listbox below.</div>
<div>2. For first two Listbox, their select status will sync automatically after you select item.</div>
<div>3. Select data 10 and data 11 of third Listbox.</div>
<div>4. Click clone and 'clone by serialization', then two Listboxes should be created and also select data 10 and data 11.</div>
<div>5. Hold Ctrl then Select data 212 of third Listbox, data 213 of fourth and data 214 of fifth, the select status of last three listbox should not sync.</div>
<div>6. Click clone and 'clone by serialization', you should see two Listboxes created and each Listbox after fifth Listbox select data 10, 11 and 212.</div>
</div>
<custom-attributes org.zkoss.zul.listbox.rod="false" />
<hbox>
<listbox id="lbxOne" height="150px" width="140px" model="${model}" onSelect="" checkmark="true" />
<listbox id="lbxTwo" height="150px" width="140px" model="${model}" onSelect="" checkmark="true" />
<listbox id="lbxThree" height="150px" width="140px" model="${model2}" onSelect="" checkmark="true" />
</hbox>
<hbox>
<textbox id="tbOne" value="box one" />
<textbox id="tbTwo" value="box two" />
<button id="btnOne" label="check equal selection" onClick='checkEqualSelection(tbOne.getValue(), tbTwo.getValue(), msg);' />
<button id="btnFour" label="show selection" onClick='showSelection(tbOne.getValue(), msg);' />
<label id="msg" />
</hbox>
<div height="10px"></div>
<button id="btnTwo" label="clone">
<attribute name="onClick">
Listbox lbx = lbxThree.clone();
lbx.setId("lbxThree_clone" + cnt++);
lbx.setParent(cloneThreeArea);
</attribute>
</button>
<button id="btnThree" label="Clone by Serialization">
<attribute name="onClick"><![CDATA[{
import java.io.*;
ByteArrayOutputStream boa = new ByteArrayOutputStream();
new ObjectOutputStream(boa).writeObject(lbxThree);
byte[] bs = boa.toByteArray();
Object n = new ObjectInputStream(new ByteArrayInputStream(bs)).readObject();
n.setId("lbxThree_serialize" + cnt++);
((Component)n).setParent(cloneThreeArea);
}]]></attribute>
</button>
<hbox id="cloneThreeArea" />
</zk>
It gives the Null pointer exception at:
ListModelArray model = ListModelArrays.getModel(ListModelArrays.MULTIPLE);
It works fine if I change the model to MULTIPLE_AND_CLONEABLE
, CLONEABLE
, or DEFAULT
.
package models;
import java.util.Comparator;
import org.zkoss.zul.ListModelArray;
public class ListModelArrays {
public static final int DEFAULT = 0;
public static final int MULTIPLE = 1;
public static final int CLONEABLE = 2;
public static final int MULTIPLE_AND_CLONEABLE = 3;
private static final int defaultAmount = 300;
public static ListModelArray getModel(int config,int items) {
ListModelArray model = null;
if (config == CLONEABLE || config == MULTIPLE_AND_CLONEABLE)
//model = (ListModelArray)org.zkoss.zktest.util.Serializations.toCloneableListModelAraay(getItems(items));
//else
model = new ListModelArray(getItems(items));
if(config == MULTIPLE || config == MULTIPLE_AND_CLONEABLE)
model.setMultiple(true);
return model;
}
public static ListModelArray getModel(int config) {
return getModel(config,defaultAmount);
}
public static Comparator getRowComparator(boolean asc) {
return new MyRowComparator(asc);
}
private static class MyRowComparator implements Comparator, java.io.Serializable {
boolean _asc;
public MyRowComparator(boolean asc) {
_asc = asc;
}
public int compare(Object o1, Object o2) {
int i1 = ListModelLists.getNumberFromData((String)o1);
int i2 = ListModelLists.getNumberFromData((String)o2);
if (_asc && i1 > i2 || !_asc && i1 < i2)
return 1;
return -1;
}
}
private static String[] getItems(int num) {
String[] Items = new String[num];
for (int i = 0; i < num; i++) {
Items[i] = new String("data "+i);
}
return Items;
}
}
Take a look at your class ListModelArrays
.
if (config == CLONEABLE || config == MULTIPLE_AND_CLONEABLE)
model = new ListModelArray(getItems(items));
if(config == MULTIPLE || config == MULTIPLE_AND_CLONEABLE)
model.setMultiple(true);
You initialize model
only if config
is CLONEABLE
or MULTIPLE_AND CLONEABLE
. Then in the second if
, when config == MULTIPLE
, you incur in a NPE
.
Fix your code there and it will work
Asked: 2014-08-25 16:33:35 +0800
Seen: 15 times
Last updated: Aug 26 '14