Добавление ClickHandler в div, который содержит много других виджетов

Кажется, что Panel не наследует от HasClickHandlers, и я не могу добавить clickHandler в DivElement. Есть ли способ добавить clickHandler в DIV?

РЕДАКТИРОВАТЬ: причина, по которой я не могу использовать Label, потому что DIV, на который я хочу кликнуть, содержит другой DIV.

3 ответа

Решение

По умолчанию Panel не "утопает" событие onCLick. То есть нажатие на панели фактически не приводит к появлению ClickEvent, и, следовательно, обработчик не запускается. Чтобы использовать события щелчка с Panel (или, если уж на то пошло, любым другим виджетом), вы должны сначала вызвать на нем sinkEvents() с соответствующими битами событий.

Например:

SimplePanel p = new SimplePanel();
    p.sinkEvents(Event.ONCLICK);
    p.setTitle("Click me");
    p.setSize("600px", "600px");
    p.addHandler(new ClickHandler(){

        @Override
        public void onClick(ClickEvent event) {

            Window.alert("SimplePanel clicked!");

        }

    }, ClickEvent.getType());

Приведенный выше фрагмент кода сначала "включает" события нажатия для SimplePanel, используя p.sinkEvents(Event.ONCLICK); а затем продолжает добавлять стандартный ClickHandler на него. Обратите внимание, что хотя SimplePanel не реализует HasClickHandlers, вы всегда можете добавить обработчик, используя addHandler() метод.

Использовать FocusPanel,

Простая панель, которая делает ее содержимое фокусируемым и добавляет возможность ловить события мыши и клавиатуры.

public class ClickableDiv extends FlowPanel implements HasClickHandlers {
    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler) {
        return addDomHandler(handler, ClickEvent.getType());
    }
}

Это должно быть все, что вам нужно. addDomHandler позаботится о "потоплении" типа события для вас.

Другие вопросы по тегам