我是ZK的全新人物。我需要在zul文件中创建 N 列表标题和 N 列表单元格。但我不知道如何从我的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>
答案 0 :(得分:1)
您可以将listhead
留空,将其连接到控制器并在那里创建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/ZK_Developer%27s_Reference/MVC/View/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
}
}