Как зарегистрировать HasEventHandlers в самодельном GWT-виджете?

Я создаю собственный виджет кнопки и хочу зарегистрировать HasClickHandlers и HasMouseoverHandlers в этом виджете. Проблема в том, что когда я использую этот виджет и добавляю ClickHandler, реакции нет.

MyButton extends Widget implements HasClickHandlers, HasMouseOverHandlers{

    Element elem;
    Element child1;
    Element child2;

    public MyButton(String txt1, String txt2){

          elem = Document.get().createDivElement();
          child1 = Document.get().createDivElement();
          child2 = Document.get().createDivElement();

          child1.setInnerText(txt1);
          child2.setInnerText(txt2);


         elem.appendChild(child1);
         elem.appendChild(child2);

         setStyleName(elem, "elem");
         setStyleName(child1, "child1");
         setStyleName(child1, "child2");

         setElement(elem);
    }

    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler) {
         return this.addHandler(handler, ClickEvent.getType());
    }

    @Override
    public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
            return this.addDomHandler(handler, MouseOverEvent.getType());
    }



}

Теперь я использую этот виджет, который должен быть кнопкой.

MyButton b1 = new MyButton("Hello", "People");
b1.addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {
            Window.alert("Hi");
        }
    });

На этот щелчок реакции нет.

b1.addMouseOverHandler(new MouseOverHandler() {
        public void onMouseOver(MouseOverEvent event) {

            anotherWidget.getElement().getStyle().setBackgroundColor("yellow");
        }
    });

MouseOverHandler работает, но не clickHandler. Что не так?


person Pero    schedule 04.11.2013    source источник


Ответы (1)


Замените свою функцию addClickHandler следующим образом.

 public HandlerRegistration addClickHandler(ClickHandler handler) {
         return this.addDomHandler(handler, ClickEvent.getType());
    }

Когда вы просто добавляете свой обработчик, он не будет синхронизироваться с событиями DOM, или для использования addHandler вам нужно явно указать синхронизацию, например,

int typeInt = Event.getTypeInt(ClickEvent.getType().getName());       
sinkEvents(typeInt);
person Abin Manathoor Devasia    schedule 04.11.2013