我有一个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();
}
});
}
请建议任何指针。
此致 阿扎
答案 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();
}
});