我见过this question asked in the ZK Forum而我正在尝试做同样的事情。
我有一个渲染器
/** {@inheritDoc} */
public void render(Listitem item, Object o, int index) throws Exception
{
Listcell cell = new Listcell();
ComponentsCtrl.applyForward(cell, "onMouseOver=onMouseOverListCell");
cell.setParent(item);
.....
在我的控制器中我有
public void onMouseOverListCell(Event event) throws Exception {
System.out.println("There was an event :->" + event.getName());
Component component = event.getTarget(); //
Listcell lc = (Listcell) event.getTarget(); //
System.out.println(lc.getLabel().toString());
}
问题在于它没有被调用。如果我将方法名称更改为onMouseOver,它会被调用,但是整个页面的鼠标悬停都会被发送到那里,父节点是Window而不是ListCell。
请有人劝告。感谢。
答案 0 :(得分:1)
为什么使用applyForward
?你必须先添加它。
在渲染器中:
Window win;
public MyRenderer(Window w){
super();
this.win = w;
}
@Override
public void render(Listitem item, MyObject data, int index) throws Exception {
.
.
.
Listcell cell = new Listcell();
cell.addForward("onMouseOver", item, "onMouseOverMyCell", data);
item.appendChild(cell);
}
在你的控制器中:
public void onMouseOverMyCell(Event event) throws Exception {
System.out.println("There was an event :->" + event.getName());
Component component = event.getTarget(); //
Listcell lc = (Listcell) event.getTarget(); //
System.out.println(lc.getLabel().toString());
}
还有一种解决方法......您可以向Listcell
添加一个类,然后使用listen注释捕获该事件:
Window win;
public MyRenderer(Window w){
super();
this.win = w;
}
@Override
public void render(Listitem item, MyObject data, int index) throws Exception {
.
.
.
Listcell cell = new Listcell();
cell.setClass("mouseOverCell");
item.appendChild(cell);
}
在您的控制器中:
@Listen("onMouseOver = #myListBoxId .mouseOverCell")
public void onMouseOverMyCell(Event event) throws Exception {
System.out.println("There was an event :->" + event.getName());
Component component = event.getTarget(); //
Listcell lc = (Listcell) event.getTarget(); //
System.out.println(lc.getLabel().toString());
}
我没有指明它,但这是一个非常重要的信息。您必须使用以下方法将渲染器中的事件侦听器连接到组件:
Selectors.wireComponents(item, win, false);
Selectors.wireEventListeners(item, win);