GWT UiHandler на HTMLPanel - PullRequest
       19

GWT UiHandler на HTMLPanel

6 голосов
/ 06 апреля 2010

Я пишу виджет со следующей разметкой:

<g:HTMLPanel ui:field="shortcutPanel" styleName="{style.shortcut}">
    <g:Image ui:field="shortcutImage"></g:Image>
    <span ui:field="shortcutLabel"></span>
</g:HTMLPanel>

По сути, это div, который оборачивает и изображение, и ярлык. Теперь, вместо добавления обработчиков событий на изображении / промежутке, я бы хотел, чтобы onClick был связан с HTMLPanel. Однако моя проблема в том, что gwt говорит мне, что

shortcutPanel не имеет связанный метод addClickHandler

Итак, я предполагаю, что разница в том, что HTMLPanel не реализует HasClickHandlers или что-то в этом роде. Мне интересно, каков стандартный способ прикрепления обработчика кликов к элементу пользовательского интерфейса, такому как HTMLPanel или, что еще лучше, есть ли такой виджет GWT, который по сути является оболочкой div, к которой я могу легко прикреплять события с помощью @UiHandler? аннотаций.

Ответы [ 4 ]

20 голосов
/ 07 апреля 2010

Вы, наверное, ищете FocusPanel - в нем есть все вкусности: HasAllFocusHandlers, HasAllKeyHandlers, HasAllMouseHandlers, HasBlurHandlers, HasClickHandlers. ... назвать несколько :) Я считаю, что это самый простой и лучший способ присоединить обработчики кликов к Panel.

7 голосов
/ 06 апреля 2010

Я не делал этого раньше, но вы могли бы сделать следующее:

  • Создайте пользовательский класс MyPanel, который расширяет HTMLPanel и реализует HasClickHandlers
  • Добавьте следующий метод в MyPanel.java
    public HandlerRegistration addClickHandler(ClickHandler handler) {
        return addDomHandler(handler, ClickEvent.getType());
    }
  • Затем замените HTMLPanel на MyPanel в вашем ui.xml и соответствующей реализации Java.

Вы всегда можете посмотреть на реализацию HTMLTable, чтобы понять, как работает распространение события. Это Panel и реализует HasClickHandlers.

2 голосов
/ 09 июля 2012

превосходно, все работает.

public class LiPanel extends HTMLPanel implements HasClickHandlers {

    LiPanel() {
        super("li", "");
    }

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

}
1 голос
/ 07 ноября 2012

Если вы хотите использовать аннотацию @UiHandler для регистрации обработчиков событий для вашего пользовательского виджета, вам необходимо повторно реализовать методы addXXHandler. Компилятор GWT, похоже, не находит их в суперклассах. например если вы хотите использовать

@UiHandler("myCustomWidget")
public void handleWidgetSelectionChangeEvent(final SelectionEvent<CountryDts> event) {
...
}

и ваш CustomWidget расширяет класс, для которого это работает, вам может понадобиться явно добавить интерфейс HasSelectionHandlers в ваш класс:

public class CustomComboBox<D> extends ComboBox<D> implements HasSelectionHandlers<D> {

    @Override
    @SuppressWarnings("pmd.UselessOverridingMethod")
    public HandlerRegistration addSelectionHandler(final SelectionHandler<D> handler) {
        // GWT Compile doesn't recognize method in supertype for UIHandler
        return super.addSelectionHandler(handler);
    }
...
}
...