ListModel更新后的ZK Listbox自动排序列

时间:2017-02-17 07:53:58

标签: java zk zul

我有一个带有ListModel的Listbox。我在doAfterCompose上设置模型,然后从计时器组件更新模型。列表框为每列都有一个排序比较器。问题是,当列被排序(升序/降序)然后刷新事件添加一行数据时,数据将作为行的最后一个元素附加,而不是根据所选列进行排序。如何添加一行然后自动排序?

logs.zul

<?init class="AuthenticationInit"?>
<zk>
<zscript>
<![CDATA[
import java.util.Comparator;
import com.akarprima.dao.model.JobStatus;
import com.akarprima.util.JobStatusComparator;
Comparator nameAsc = new JobStatusComparator(true, JobStatusComparator.NAME);
Comparator nameDsc = new JobStatusComparator(false, JobStatusComparator.NAME);
Comparator dateAsc = new JobStatusComparator(true, JobStatusComparator.DATE);
Comparator dateDsc = new JobStatusComparator(false, JobStatusComparator.DATE);
Comparator sessionAsc = new JobStatusComparator(true, JobStatusComparator.SESSION);
Comparator sessionDsc = new JobStatusComparator(false, JobStatusComparator.SESSION);
Comparator sTimeAsc = new JobStatusComparator(true, JobStatusComparator.START_TIME);
Comparator sTimeDsc = new JobStatusComparator(false, JobStatusComparator.START_TIME);
Comparator eTimeAsc = new JobStatusComparator(true, JobStatusComparator.END_TIME);
Comparator eTimeDsc = new JobStatusComparator(false, JobStatusComparator.END_TIME);
Comparator durationTimeAsc = new JobStatusComparator(true, JobStatusComparator.DURATION);
Comparator durationTimeDsc = new JobStatusComparator(false, JobStatusComparator.DURATION);
   ]]>
</zscript>
<window border="none"
    apply="JobLogController">
    <label id="message" />
    <listbox id="jobLog" height="100%" sizedByContent="true"
        span="true">
        <listhead>
            <listheader label="No" />
            <listheader label="Date" sortAscending="${dateAsc}"
                sortDescending="${dateDsc}" />
            <listheader label="Session"
                sortAscending="${sessionAsc}" sortDescending="${sessionDsc}" />
            <listheader label="Job Name" sortAscending="${nameAsc}"
                sortDescending="${nameDsc}" sortDirection="ascending" />
            <listheader label="Start" sortAscending="${sTimeAsc}"
                sortDescending="${sTimeDsc}" />
            <listheader label="Finish" sortAscending="${eTimeAsc}"
                sortDescending="${eTimeDsc}" />
            <listheader label="Running Time"
                sortAscending="${durationTimeAsc}"
                sortDescending="${durationTimeDsc}" />
        </listhead>
        <template name="model">
            <listitem>
                <listcell label="${forEachStatus.index + 1}" />
                <listcell label="${each.value.date}" />
                <listcell label="${each.value.session}" />
                <listcell label="${each.value.jobName}" />
                <listcell label="${each.value.startTime}" />
                <listcell label="${each.value.endTime}" />
                <listcell label="${each.value.duration}" />
            </listitem>
        </template>
    </listbox>
    <timer id="timer" delay="5000" repeats="true" />
</window>
   </zk>

JobLogController.java

package com.akarprima.idx.controller.daily;

public class JobLogController extends SelectorComposer<Component>
{
    private static final long serialVersionUID = 4463081939576759090L;
    AppJobStatusDAO ajdao = new AppJobStatusDAO();

    @Wire
    private Listbox jobLog;

    private ListModelMap<String, JobStatus> jd = new ListModelMap<String, JobStatus>();

    @Override
    public void doAfterCompose(Component comp) throws Exception
    {
        super.doAfterCompose(comp);
        jobLog.setModel(jd);
        refresh();
    }

    @Listen("onTimer = timer")
    public void refresh()
    {
        AppUtils.compareAddMap(jd, ajdao.getJobLogDailyMap());
    }
}

0 个答案:

没有答案