排序

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 )有些不用,所以Collectionssort方法是不会工作的。

为了简化组件的排序,我们提供了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>