未捕获列表框中的ZK onMouseOver事件

时间:2014-07-01 06:33:55

标签: listbox mouseover zk

我见过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。

请有人劝告。感谢。

1 个答案:

答案 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);