我在ZK中是全新的。我需要在我的zul文件中创建 n listheaders和 n listCells。但是我不知道该如何从Java控制器中执行此操作,并且使用MVVM是>不是。
问题将是:
@Wire
private Window idWindow;
private Listheader header;
private Listcell item1;
@Override
public void onCreate(Event event) {
header.setLabel("laaaa");// It would set just one header but I can have many (N headers) and same for items
}
<zk>
<window id="idWindow" title="nameWindow" apply="controller.java" border="normal" closable="true" sizable="true" maximizable="true" maximized="true" height="85%" width="150%" style="overflow:auto;">
<!-- CONTINUES -->
<listbox id="mainList" hflex="1" vflex="1">
<listhead>
<listheader id="header" label="A" />
<listheader id="header1" label="B" />
<listheader id="header2" label="C" />
....
<listheader id="headerN" label="N" />
</listhead>
<listitem>
<listcell id="item1" label="A"/>
<listcell id="item2" label="B"/>
<listcell id="item3" label="C"/>
....
<listcell id="itemN" label="D"/>
</listitem>
</listbox>
<!-- CONTINUES -->
</window>
</zk>
您可以将listhead
留在ZUL中,将其连接到控制器中,然后在此处创建listheaders
。重要的步骤是向listbox
询问其listhead
,并将listheaders
附加到它。对于单元格,如果您使用模型提供列表数据,请给您的listbox
渲染器,为每个项目创建它们。
您的Zul会短得多:
<zk>
<window ... >
<listbox id="mainList" hflex="1" vflex="1">
<listhead />
</listbox>
</window>
</zk>
然后在控制器中,您在doAfterCompose
中创建标头并将渲染器附加:
@Wire
private Listbox mainList;
@Override // This method should be specified by a composer super class
public void doAfterCompose(Component comp)throws Exception
{
super.doAfterCompose(comp);
mainList.setModel(someModelWithYourData);
// create listheaders (manually/in for-loop/based on data...)
Listhead head = mainList.getListhead();
head.appendChild(new Listheader("A"));
...
// attach renderer
mainList.setItemRenderer(new ListitemRenderer<Object>() // use proper data type instead of Object
{
@Override
public void render(Listitem item, Object data, int index)
throws Exception
{
item.appendChild(new Listcell("a"));
...
}
});
}
ZK的开发人员网站上还有一个示例:https://www.zkoss.org/wiki/wiki/zk_developer's_reference/mvc/mvc/renderer/listbox_renderer
如果您无法使用模型,也可以在ZUL或控制器中附加listitems
,然后创建ListCells:
for (Component child : mainList.getChildren())
{
if (child instanceof Listitem)
{
Listitem item = (Listitem) child;
// do the same as in the renderer
}
}