Подтвердить что ты не робот

Документация для @UiHandler

Я начал изучать использование GWT в сочетании с UiBuilder. Я немного озадачен тем, как вы можете использовать директиву @UiHandler(..) для создания простого кода дескриптора события, записанного в документации GWT:

@UiHandler("button")
void handleClick(ClickEvent e) {
  Window.alert("Hello, AJAX");
}

В этом случае используется метод handleClick. Как вы знаете, для каждого виджета GWT, какие методы могут быть созданы с помощью @UiHandler? Для некоторых вы также можете создать метод doClose().

Но что вы можете использовать, например, для ListBox для получения события, когда выбран элемент? Где в документации я могу это увидеть?

4b9b3361

Ответ 1

Параметр, который вы передаете аннотации @UiHandler, - это имя соответствующего поля, которое вы хотите назначить, *Handler. Итак, в этом случае вы назначаете ClickHandler a Button button (на самом деле, мы просто знаем имя поля).

Как это точно работает - это часть магии GWT:) Я предполагаю, что, как и любой другой код, связанный с UiBinder (я думаю, что была презентация в Google IO, которая показывала код, который генерирует UiBinder), на время компиляции компилятор определяет, что происходит. В этом примере: у нас есть Button button, и мы имеем аннотированный метод @UiHandler, который имеет параметр ClickEvent → , который должен означать a ClickHandler (обратите внимание, что имя метода не имеет значения). Поэтому добавьте код во время компиляции (возможно, в конструктор), который добавляет этот обработчик к кнопке. Если вас интересует более полный ответ - проверьте источник: D

Но что вы можете использовать, для instance, a ListBox, чтобы получить событие элемент выбран? Где в документацию можно увидеть?

В ссылка на API GWT. В этом случае вы, вероятно, ищете ListBox.addChangeHandler. Но вы обычно не найдете там @UiHandler связанного кода - потому что он будет избыточным - вы всегда строите методы @UiHandler одинаково:

  • Вы проверяете *Handler, который хотите добавить, скажем ChangeHandler
  • Он имеет void onChange(ChangeEvent event) - поэтому ваш метод нуждается в параметре ChangeEvent и должен выглядеть следующим образом:

    @UiHandler("listBox")
    void whateverName(ChangeEvent event) {
        // ...
    }
    

Ответ 2

Вероятно, ваша проблема заключается в методе onModuleLoad:

public void onModuleLoad() 
{       
    HelloWorld helloWorld = new HelloWorld("BOTAO"); 

    // Using this way @UiHandler will not work
    //Document.get().getBody().appendChild(helloWorld.getElement()); 

    // correct way
    RootPanel.get().add(helloWorld);  
}