#gwt
#gwt
Вопрос:
У меня есть страница, использующая StackLayoutPanel.
Для этих 3 стеков требуются отдельные таблицы ячеек.
В настоящее время мне нужно использовать следующие события: RangeChangeEvent, SelectionChangeEvent.
Теперь вопрос в том, как отличить OnRangeChangeEvent друг от друга.
Комментарии:
1. Например, используйте отдельный RangeChangeEvent. Обработчик и SelectionChangeEvent. Обработчик для каждой таблицы ячеек?
Ответ №1:
На исходную таблицу ссылается событие, которое вы перехватываете. «event.getSource()» всегда дает ссылку на объект, который вызвал событие.
Например, если у вас есть три таблицы, и вы прикрепляете тот же обработчик, что и ниже:
RangeChangeEvent.Handler handler = new RangeChangeEvent.Handler() {
@Override
public void onRangeChange(RangeChangeEvent event) {
if(table1 == event.getSource()){
// first table
} else if (table2 == event.getSource()){
// second table
} else if (table3 == event.getSource()){
// third table
}
};
table1.addRangeChangeHandler(handler);
table2.addRangeChangeHandler(handler);
table3.addRangeChangeHandler(handler);
В приведенном выше примере предполагается, что в таблицах не указана модель выбора. Если есть, модель выбора будет источником событий.
В качестве альтернативы, вы можете просто прикрепить обработчик для каждой таблицы:
RangeChangeEvent.Handler handler1 = new RangeChangeEvent.Handler() {
@Override
public void onRangeChange(RangeChangeEvent event) {
// Handle stuff happening to table 1
}
};
RangeChangeEvent.Handler handler2 = new RangeChangeEvent.Handler() {
@Override
public void onRangeChange(RangeChangeEvent event) {
// Handle stuff happening to table 2
}
};
table1.addRangeChangeHandler(handler1);
table2.addRangeChangeHandler(handler2);
// And so on for any more tables
При таком подходе вам не нужно будет беспокоиться об источнике события, поскольку вы уже знаете, какой обработчик соответствует какой таблице.
Комментарии:
1. Извините, это не работает, поскольку event.getSource() возвращает SingleSelectionModel.
2. Верно, я предполагал, что модели выбора не было. Я обновлю пример.
3. Я думаю, что опасно запрашивать источник события для объекта, который его запустил, если он не был установлен явно. Javadoc для getSource в классе событий упоминает, что его тип и значение являются произвольными. Его следует использовать в качестве вторичного ключа к обработчику. Также это может быть установлено при запуске события с использованием шины событий
4. @Guarav Я не думаю, что это опасно, но я согласен, что это не сработает, если, как вы указали, любой объект может быть установлен в качестве источника. Я предполагал, что событие находится в самой таблице.
Ответ №2:
Вы устанавливали одинаковые обработчики событий для каждого CellTable
? Если да, то не делайте этого. Вы можете просто создать другой обработчик для каждой CellTable
. Хотя теоретически было бы возможно определить источник, как в примере filip-fku, этого не будет, если вы используете SelectionModel
.
Итог: вы не должны пытаться использовать одни и те же обработчики для нескольких объектов, если вам абсолютно не нужно.