如何在 ZK 中动态添加 listheaders 和 listcells
How to dynamically add listheaders and listcells in ZK
我是 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>
您可以将 zul 中的 listhead
留空,将其连接到您的控制器并在那里创建 listheaders
。重要的一步是向 listbox
询问其 listhead
,并将 listheaders
附加到它。对于单元格,如果您使用模型来提供列表数据,请为您的 listbox
渲染器为每个项目创建它们。
你的 zul 会更短:
<zk>
<window ... >
<listbox id="mainList" hflex="1" vflex="1">
<listhead />
</listbox>
</window>
</zk>
然后在您的控制器中,在 doAfterCompose
中创建 header 并附加渲染器:
@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
,然后创建列表单元:
for (Component child : mainList.getChildren())
{
if (child instanceof Listitem)
{
Listitem item = (Listitem) child;
// do the same as in the renderer
}
}
我是 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>
您可以将 zul 中的 listhead
留空,将其连接到您的控制器并在那里创建 listheaders
。重要的一步是向 listbox
询问其 listhead
,并将 listheaders
附加到它。对于单元格,如果您使用模型来提供列表数据,请为您的 listbox
渲染器为每个项目创建它们。
你的 zul 会更短:
<zk>
<window ... >
<listbox id="mainList" hflex="1" vflex="1">
<listhead />
</listbox>
</window>
</zk>
然后在您的控制器中,在 doAfterCompose
中创建 header 并附加渲染器:
@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
,然后创建列表单元:
for (Component child : mainList.getChildren())
{
if (child instanceof Listitem)
{
Listitem item = (Listitem) child;
// do the same as in the renderer
}
}