org.zkoss.zk.ui.Component
接口中的getChildren
方法返回的列表是实况的(live)。org.zkoss.zul.Listbox
中的getItems
方法及其它
接口中的对应方法也是如此。换言之,你可以动态操纵其内容。例如,下面的语句是等价的:
comp.getChildren().remove(0); ((Component)comp.getChildren().get(0)).setParent(null);
但是,你不能够使用java.util.Collections
类的sort
方法为它们排序。原因是很微妙的(subtle):当你将列表添加到另一位置时,children列表会自动从原始的位置移除一个child。例如,下面的代码实际上移动了第一个child前的第二个child。
comp.getChildren().add(0, comp.getChildren().get(1));
这和平常的列表(例如LinkedList )有些不用,所以Collections
的sort
方法是不会工作的。
为了简化组件的排序,我们提供了org.zkoss.zk.ui.Components
类的sort
方法来处理children列表。
在下面的例子中,我们使用sort
方法和org.zkoss.zul.ListitemComparator
来为一个listbox排序。
注意,这仅是用来说明listbox直接支持listitem的排序。详情请参考ZUML页面及XUL组件集一章中列表框一节。
<window title="Sort Listbox" border="normal" width="200px"> <vbox> <listbox id="l"> <listhead> <listheader label="name"/> <listheader label="gender"/> </listhead> <listitem> <listcell label="Mary"/> <listcell label="FEMALE"/> </listitem> <listitem> <listcell label="John"/> <listcell label="MALE"/> </listitem> <listitem> <listcell label="Jane"/> <listcell label="FEMALE"/> </listitem> <listitem> <listcell label="Henry"/> <listcell label="MALE"/> </listitem> </listbox> <hbox> <button label="Sort 1" onClick="sort(l, 0)"/> <button label="Sort 2" onClick="sort(l, 1)"/> </hbox> </vbox> <zscript> void sort(Listbox l, int j) { Components.sort(l.getItems(), new ListitemComparator(j)); } </zscript> </window>