[google-appengine-java-russian:236] ClickEvent для вложенных объектов

10 views
Skip to first unread message

burdakovd

unread,
May 19, 2010, 2:04:18 AM5/19/10
to Google App Engine for Java on Russian
Есть таблица, есть для неё ClickHandlers.

Проблема в том, что внутри таблицы есть вложенные CheckBox, и при
клике по ним генерируется ClickEvent также и для для таблицы.
Как запретить такую генерацию, или как по ClickEvent определить, что
он относится не к самой таблице, а к вложенным объектам?

Vitaly Gashock

unread,
May 19, 2010, 4:26:33 AM5/19/10
to google-appengi...@googlegroups.com
Доброго времени суток.
Накидал по-быстрому солюшн для Вашей проблемы.

Решение простое: нужно в клик-хандлере для чекбокса после "полезной" логики остановить прокидывание ивента методом stopPropagation().

Код:
        // . . . . . .
        public OrderedTable() {
initWidget(uiBinder.createAndBindUi(this));
initTableHeader();
fillTableWithDummyData();
tableOrdered.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Cell cell = tableOrdered.getCellForEvent(event);
Window.alert("You are clicked on row: " + cell.getRowIndex());
}
});
}
private void fillTableWithDummyData() {
for (int i = 0; i < 15; i++) {
addRow(i);
}
}
private void addRow(final int index) {
final Label labelTitleCell = new Label("Value: " + String.valueOf(index + 1));
final CheckBox cb = new CheckBox("CheckBox" + String.valueOf(index));
cb.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("You are clicked on CheckBox: " + String.valueOf(index));
event.stopPropagation();
}
});
final HorizontalPanel hp = new HorizontalPanel();
hp.setSpacing(3);
hp.add(labelTitleCell);
hp.add(cb);
tableOrdered.setWidget(rowIndex, 0, hp);
rowIndex++;
}
        // . . . . . . 


Kind regards,
Vitaly Gashock


19 мая 2010 г. 9:04 пользователь burdakovd <icq...@gmail.com> написал:

Daniel Burdakov

unread,
May 19, 2010, 9:29:42 AM5/19/10
to google-appengi...@googlegroups.com
Спасибо, именно то что надо.
Кстати в примере на http://table.latest.gshock-lab.appspot.com/ если кликать не по квадрату чекбокса, а по его надписи - то всё равно срабатывают оба обработчика, причём первым - табличный, а потом уже чекбокса. В моём случае надписей не будет, но всё же хотелось бы знать, почему во втором случае события происходят не в том порядке.

19 мая 2010 г. 11:26 пользователь Vitaly Gashock <gsh...@gmail.com> написал:

Vitaly Gashock

unread,
May 19, 2010, 9:38:12 AM5/19/10
to google-appengi...@googlegroups.com
Да, действительно есть такое поведение. Сам заметил после того, как запостил солюшн.
Ответить сразу не могу, нужно углубляться. Как вариант можно обыграть в клик-хендлере для всей таблицы проверку event.getSource(), но то уже такое, если нужно будет...

Рад, что смог помочь ;)

Kind regards,
Vitaly Gashock


19 мая 2010 г. 16:29 пользователь Daniel Burdakov <kre...@kreved.org> написал:
Reply all
Reply to author
Forward
0 new messages