Event.sinkEvents不起作用

时间:2014-08-21 18:33:33

标签: gwt vaadin7

我有一个vaadin 7客户端小部件,里面有一个DIV元素。我试图通过Event.sinkEvents在DIV elment上注册click事件。但是浏览器事件永远不会被解雇。这是一段代码

public class MyWidget extends Widget{
 private final DivElement popup = Document.get().createDivElement();

public MyWidget() {

initDOM();
initListeners();
}


private void initDOM(){
popup.setClassName(STYLECLASS);
setElement(popup);
}

public void initListeners(){
Event.sinkEvents(popup, Event.ONCLICK|Event.MOUSEEVENTS);
Event.setEventListener(popup, new EventListener() {

@Override
public void onBrowserEvent(Event event) {
Window.alert("clicked"); // this never get fired.
event.stopPropagation();
}
});

}

请建议任何指针。

此致 阿扎

3 个答案:

答案 0 :(得分:0)

从不需要在窗口小部件中执行DOM.setEventListener(事实上应该避免) - 只需在下沉这些事件后覆盖窗口小部件自己的onBrowserEvent方法。通过下沉这些事件并将小部件附加到父级,GWT已在内部调用小部件本身的setEventListener,以便它可以处理自己的事件。

答案 1 :(得分:0)

不使用Event#sinkEvents,而是使用Widget#sinkEvents。并覆盖小部件的onBrowseEvent来处理事件。

这应该这样做:

public class MyWidget extends Widget{
private final DivElement popup = Document.get().createDivElement();

public MyWidget() {
    initDOM();
}


private void initDOM(){
    popup.setClassName(STYLECLASS)
    setElement(popup);
    sinkEvents(Event.ONCLICK|Event.MOUSEEVENTS);
}

@Override
public void onBrowserEvent(Event event) {
    super.onBrowserEvent(event);
    if(event.getTypeInt()==Event.ONCLICK){
        Window.alert("Clicked");
    }
}

}

答案 2 :(得分:0)

是的,覆盖onBrowserEvent方法有效。

以下代码工作。

Event.sinkEvents(popup, Event.ONCLICK|Event.MOUSEEVENTS);

替换为

sinkEvents(Event.ONCLICK|Event.MOUSEEVENTS);

将事件放在窗口小部件而不是任何DIV上。在此之后,布劳尔事件被解雇了。

public void onBrowserEvent(Event event) {
Window.alert("clicked"); // this never get fired.
event.stopPropagation();
}
});