Добавление 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
позаботится о "потоплении" типа события для вас.