グリッドは列のソーティング(並び替え)をサポートしています。特定の行を昇順にするために、行のsortAscendingプロパティにjava.util.Comparatorのインスタンスを指定します。同様にして、降順にするsortDescendingプロパティにコンペアレーターを指定します。
以下に説明しているように、グリッド中の適当な2列を比較するのに、コンペアレーターを初めに実装します。sortAscendingとsortDescendingプロパティにそのインスタンスを指定します。compareメソッドは二つのorg.zkoss.zul.Rowのインスタンスと共に呼び出されます。
<zk> <zscript> class MyRowComparator implements Comparator { public MyRowComparator(boolean ascending) { ... } public int compare(Object o1, Object o2) { Row r1 = (Row)o1, r2 = (Row)o2; .... } } Comparator asc = new MyRowComparator(true); Comparator dsc = new MyRowComparator(false); </zscript> <grid> <columns> <column sortAscending="${asc}" sortDescending="${dsc}"/> ...
sortDirectionプロパティはクライアントで特定の行の順番を示すためのアイコンを表示させるかどうかをコントロールします。列がグリッドに加えられる前に並び替えるなら、確実にこのプロパティを設定すべきです。
<column sortDirection="ascending"/>
同じ行にコンペアレーターを指定する限り、グリッドによって自動的に保存されます。
一行に少なくとも一つのコンペアレーターを指定してユーザーがそれらをクリックした場合、onSortイベントはサーバーに送られます。columnコンポーネントはリスナを実装して自動的に指定されたコンペアレーターを元にして列をソートします。
手動でそれを制御する場合、onSortイベントを行うために、自身のリスナを行に追加することができます。デフォルトリスナにsortメソッドを呼び出させないために、イベントを受け取るたびにstopPropagationメソッドを呼び出さなければなりません。代わりに以下に示すように、sortメソッドをオーバーライドできます。
sortメソッドはデフォルトのonSortイベントリスナに元々実装されているものです。Javaコードによって列をソートする場合はとても便利です。例えば、適切な順番になっていない列を追加した後に、このメソッドを呼び出します。
Row row = new Row(); row.setParent(rows); row.appendChild(...); ... if (!"natural".column.getSortDirection()) column.sort("ascending".equals(column.getSortDirection()));
デフォルトのソートアルゴリズムはquick-sortです(org.zkoss.zk.ui.Componentsクラスの中のsortメソッドを使用します)。自身の実装でオーバーライドできます。
【メモ】:sortメソッドは並び替えの方向のチェックを行います(getSortDirectionの呼び出します)。方向が異なっている場合のみ、列をソートします。ソートを行うために、以下のようにします。
column.setSortDirection("natural"); sort(myorder);
上のコードは以下のものと同様の働きをします。
sort(myorder, true);