Обработчик элементов DOM в GWT

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

        Button button = new Button("Click");
        Element buttonElement = button.getElement();

        Event.setEventListener(buttonElement, new EventListener() {

            @Override
            public void onBrowserEvent(Event event) {

                String string = event.getType();

                if(string.equalsIgnoreCase("click")) {
                    System.out.println("CLICK");
                }
            }
        });

        Event.sinkEvents(buttonElement, Event.ONCLICK);

person Mani    schedule 14.05.2013    source источник


Ответы (1)


Ваш код правильный, вы можете добавить виджет после события приемника. вы должны добавить виджет перед событием приемника. просто пример:

Button  button=new Button("Click");
    Element buttonElement = button.getElement();
      RootPanel.get().add(button);
    Event.sinkEvents(buttonElement, Event.ONCLICK);
    Event.setEventListener(buttonElement, new EventListener() {

        @Override
        public void onBrowserEvent(Event event) {
            System.out.println("ok");
             if(Event.ONCLICK == event.getTypeInt()) {
                 Window.alert("ok");
                  System.out.println("CLICK");
             }

        }
    });
person bNd    schedule 14.05.2013
comment
но почему нам нужно вызывать функцию sinEvents после этого. - person Mani; 14.05.2013
comment
Потому что Button (и большинство виджетов) будет принимать событие только в том случае, если для него есть обработчик; это делается автоматически addDomHandler. Здесь по какой-то неизвестной причине вы не хотите addClickHandler, поэтому вам приходится звонить sinkEvents самостоятельно. Кстати, зачем создавать виджет Button, если вы не используете его события? Как насчет Document.get().createButtonElement()? - person Thomas Broyer; 14.05.2013
comment
@ThomasBroyer на самом деле я хотел сделать строки сетки данных перетаскиваемыми, и для этого я получил строку как элемент и хотел добавить к ней обработчик. [stackoverflow.com/questions/16536118/ - person Mani; 14.05.2013
comment
@Mani Потому что у каждого виджета должен быть один корневой элемент. Всякий раз, когда виджет прикрепляется, он создает ровно одну обратную ссылку от элемента к виджету, которая elem.__listener = widget выполняется в DOM. - person bNd; 14.05.2013
comment
@Bhumika: это только в том случае, если вы явно не используете Event.setEventListener (который работает на уровне элемента, а не на уровне виджета, и поэтому не имеет понятия прикрепленного/отсоединенного); sinkEvents также вызывается только в первом onAttach на виджетах. - person Thomas Broyer; 14.05.2013
comment
Хорошо, спасибо, сэр, за исправление :) До сих пор я думал, что событие приемника вызывается как для подключенного, так и для отсоединенного. - person bNd; 14.05.2013