GWT — как добавить более 1 таблицы ячеек на одной странице

#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 .

Итог: вы не должны пытаться использовать одни и те же обработчики для нескольких объектов, если вам абсолютно не нужно.