Home   Single Page

並び替え(ソート)

org.zkoss.zk.ui.ComponentインターフェースのgetChildrenメソッドから返されるリストは動的(ライブ)です。
org.zkoss.zul.ListboxインターフェースのgetItemsや他のメソッドのgetItemsで返されるリストも同様にライブです。
つまりそのコンテンツを直接処理することができます。例えば、以下のステートメントはそのような働きです。

comp.getChildren().remove(0);
((Component)comp.getChildren().get(0)).setParent(null);

しかし、java.util.Collectionsクラスのsortメソッドを使用して並び替えることはできません。
その理由は、ある子要素を他の位置へ追加するとき、子要素のリストが自動的に元々あった位置から子要素を取り除きます。
例えば、以下のステートメントは実際に2番目の子要素を初めの子要素の前に移動します。

comp.getChildren().add(0, comp.getChildren().get(1));

(LinkedListのように)普通のリストとは違った働きをするので、Collectionsのsortメソッドは動作しません。

コンポーネントの並べ替えを簡単にするため、子要素リストに使用できるorg.zkoss.zk.ui.Componentsクラスの中のsortメソッドを提供します。

以下の例中で、sortメソッドとorg.zkoss.zul.ListitemComparatorを使用してリストボックスに並び替え機能をつけます。

ここではリスト項目を使用してソート機能を説明しましたが、リスト項目は実は元々並び替えられます。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>