Доброго времени суток!
Есть две таблицы «Работники»(Workers) и «Задачи работников» (WorkerTasks). Связаны как «один к многим» (Поле Worker таблицы WorkerTasks – это внешний ключ связи с таблицей Worker (по id)). С созданием и заполнением особых проблем нет – в трейс получается вывести корректный результат и с помощью критериев гиберната, и с помощью HQL, и с помощью обыкновенных SQL-запросов Проект делаю на Maven в IDE Eclipse. Проблема возникла, когда дошла очередь до интерфейса, который по заданию необходимо сделать на ZK. А сделать с помощью ZK интерфейса нужно следующее: список работников поместить в разворачивающийся список Listbox, а задачи в таблицу Grid. При селекте работника, таблица заполняется задачами только выбранного (селектом в Listbox-е) работника. При смене работника соответственно меняется заполнение таблицы. Для решения задачи я создал файл интерфейса index.zul и java-class WorkerController. Попытался реализовать интерфейс с помощью MVC. Все сначал шло хорошо – заполнился listbox при загрузке index.zul. Правда, я не понял – как сделать selected (элемент списка по умолчанию). Ответ на этот вопрос мне интересен, но это – второстепенный вопрос. Главный вопрос связан с применением метода setModel. При попытке его применить к таблице Grid (она у меня обозвана workerListbox) возникает ошибка NPE. Как я понял с форумов всяких этих англосаксов, такое явление объясняется тем, что моя Grid workerListbox имеет значение null. Я – новичок в java и ZK, поэтому мне сложно представить себе – каким должно быть значение у идентификатора типа Grid (да, собственно и других типов – listbox, combobox и т.д.) и как его установить в значение, отличное от null??? Может я вообще, концептуально неправ – мне стоит изменить подход к реализуемой модели? В этом случае все равно взываю о помощи – помогите советом или указанием.
Вот мой index.zul (его целевая часть)
| Код | <tabpanel>
<window id="TaskTitle" title="Планирование задач сотрудника" border="normal" width="280px" apply="my.workers.zk.WorkerController">
<hbox pack="center" align="top" width="100%" height="80px"> <style src="/widgets/css/html.css" /> <div height="50px" width="443px" class="combodivarea"> <separator spacing="10px" /> <label value="Сотрудник" class="boxlabel" />
<listbox id="cmbwoker1" model="${TaskTitle$composer.workerList}" mold="select" width="150px"> <template name="model"> <listitem label="${each}" id="${each.id}" /> </template> </listbox>
</div>
</hbox>
</window>
<separator height="30px"></separator>
<window id="TaskTable" border="normal" width="800px" apply="my.workers.zk.WorkerController"> Таблица задач
<grid height="300px" model="${TaskTable$composer.workertaskList}" emptyMessage="No found in the result"> <columns> <column label="Задача"/> <column label="дата нач." /> <column label="ДатаКон" /> </columns> <template name="model"> <row> <label value="${each.task.description}" /> <label value="${each.dateBeg}" /> <label value="${each.dateEnd}" /> <textbox /> </row> </template> </grid>
</window>
</tabpanel>
|
Мой WorkerController
| Код | package (чемодан творчества рук моих);
import java.util.ArrayList; import java.util.List; import java.util.Set;
import (мое творчество);
import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.select.SelectorComposer; import org.zkoss.zk.ui.select.annotation.Listen; import org.zkoss.zk.ui.select.annotation.Wire; import org.zkoss.zkplus.spring.SpringUtil; import org.zkoss.zul.Grid; import org.zkoss.zul.ListModel; import org.zkoss.zul.ListModelList; import org.zkoss.zul.Listbox;
public class WorkerController extends SelectorComposer<Component> { private static final long serialVersionUID = 8243942703081449079L; private WorkersDao workServ = (WorkersDao) SpringUtil.getBean("workersDao"); private WorkerTasksDao worktaskServ = (WorkerTasksDao) SpringUtil.getBean("workerTasksDao"); private ListModelList<Workers> workerList = new ListModelList<Workers>(workServ.findAll()); private ListModel<WorkerTasks> workertaskList; List<WorkerTasks> wtArray = new ArrayList<WorkerTasks>(); @Wire private Listbox cmbwoker1; @Wire private Grid workerListbox = null;
public ListModel<Workers> getWorkerList() { return workerList; }
public ListModel<WorkerTasks> getWorkertaskList() { return workertaskList; }
@Listen("onSelect = #cmbwoker1") public void changeCmbwoker1() { Set<Workers> selection = ((ListModelList)cmbwoker1.getModel()).getSelection(); Workers worker1 = selection.iterator().next();
workertaskList = new ListModelList<WorkerTasks>(wtArray); List<WorkerTasks> wtList = worktaskServ.findAllByWorker(worker1); for (WorkerTasks wtItem : wtList) { wtArray.add(wtItem); }
workerListbox.setModel(workertaskList); } }
|
Заранее, спасибо! |