Home   Single Page

ライブデータ

グリッド[41]のようにリストボックスはライブデータをサポートしています。ライブデータを使うと、開発者はビューからデータを分けます。
つまり開発者の仕事は、直接リストボックスを処理することより、むしろorg.zkoss.zul.ListModelインターフェースを実装することによる、データ供給だけが必要となります。利点は2つあります。

ライブデータを使用する三つのステップがあります。

  1. ListModelのフォーム中でデータを準備します。ZKではオブジェクト群を表示するためにorg.zkoss.zul.SimpleListModelと呼ばれる具体的な実装があります。

  2. データの項目をレンダリングしリストボックスのリスト項目へ表示するためにorg.zkoss.zul.ListitemRendererインターフェースを実装します。

  1. modelプロパティ中にデータを指定します。オプションとして、itemRendererプロパティにレンダラーを指定します。

以下の例ではstrsetと呼ばれるリストモデルを準備しますmodelプロパティを通してそれをリストボックスに指定します。そのため、リストボックスは残りの作業を全部代わりに実行してくれます。

<window title="Livedata Demo" border="normal"><zscript>String[] data = new String[30];for(int j=0; j &lt; data.length; ++j) {data[j] = "option "+j;}ListModel strset = new SimpleListModel(data);</zscript><listbox width="200px" rows="10" model="${strset}"><listhead><listheader label="Load on demend"/></listhead></listbox></window>                                                                                        

ライブデータを使用したソーティング

ライブデータが使用できるリストボックスをソート可能にするなら、org.zkoss.zul.ListModelに加えて、org.zkoss.zul.ListModelExtインターフェースを実装しなければなりません。

class MyListModel implements ListModel, ListModelExt {
    public void sort(Comparator cmpr, boolean ascending) {    
        //do the real sorting        
        //notify the listbox (or grid) that data is changed by use of ListDataEvent        
    }    
}

ユーザーがリストボックスにソート要求するとき、リストボックスはListModelExtのsortメソッドを呼び出し、データをソートします。リストボックスよりむしろ、リストモデルによってソーティングは行われます。

ソート後は、(addListDataListenerメソッドにより) リストボックスに記憶されたorg.zkoss.zul.event.ListDataListenerインスタンスのonChangeメソッドを呼び出すことより、リストモデルはリストボックスに通知します。ほとんどの場合全データはたいてい変更され、リストモデルは以下のイベントを送信します。

new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, -1, -1)

メモ:ListModelとListModelExtの実装は視覚表現に依存しません。つまり、グリッド、リストボックス、ListModelをサポートしている他のコンポーネントと共にそれらは使用されます。

つまり、柔軟性を高めるにはコンポーネントを使用することは想定すべきではないです。むしろ、ListDataEventを使用して通信します。



[41] Swing (javax.swing.ListModel)のコンセプトと類似しています。