Лучшая практика обработки событий GWT - PullRequest
2 голосов
/ 29 июля 2011

Я совершенно новичок в дизайне интерфейсов и пытаюсь понять, как лучше всего обрабатывать события.В прямом случае обработчика и (в данном случае) кнопок, вызывающих событие, относящееся к одному классу, это нормально, я понял.Обработчик может видеть кнопки так, что он может сказать:

if (event.getSource() == myButton)

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

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

например,

Из моего основного класса макета я создаю и показываюнастраиваемый диалог.Этот диалог реализован в своем собственном классе.В идеале диалог должен использовать обработчик из основного класса макета (он реализует ClickHandler), что было бы хорошо, но в моем приложении есть несколько разных ClickEvents.Я различаю их, как указано выше, проверяя источник.В этом случае кнопки находятся в диалоговом классе, поэтому я не могу просто сказать:

if (event.getSource() == myDialogbutton)

, поскольку myDialogButton находится вне области действия.

Любые подсказки о том, как это должно работать, будутбыть оцененным.

D

Ответы [ 5 ]

4 голосов
/ 29 июля 2011

Возможно, я могу помочь вам с моим решением ...

Я унаследовал ClickHandler для собственного класса, который является универсальным. Вы можете предоставить ClickHandler любой вид объекта, который вам нужен, и сможете получить к нему доступ из метода.

Пример:

import com.google.gwt.event.dom.client.ClickHandler;

public abstract class ClickHandlerData<T> implements ClickHandler {
    private T data;

    public ClickHandlerData(T data)
    {
        this.data = data;
    }

    public T getData()
    {
        return data;
    }

    public void setData(T data)
    {
        this.data = data;
    }
}

Теперь, в случае кнопки:

Button btn = new Button("click me");
btn.addClickHandler(new ClickHandlerData<Button>(btn)) {
    public void onClick(ClickEvent event) {
        Button btn = getData();
        ...
    }
}

Я использую этот класс для передачи параметров, таких как целые числа или что-то еще, в ClickHandler. Например:

for (int i=0;i<10;i++)
{
    Button btn = new Button("click me");
    btn.addClickHandler(new ClickHandlerData<Integer>(i)) {
        public void onClick(ClickEvent event) {
            Window.alert("you klicked button "+getData());
            ...
        }
    }
}

Я также делаю то же самое для AsyncCallbacks, для команд, для всего остального, что мне нужно для передачи данных.

Надеюсь, это вам немного помогло.

1 голос
/ 13 июля 2013

Попробуйте создать новый слушатель для каждого анонимного или серийного виджета, например. кнопка в FlexTable. Таким образом, их жизненные циклы связаны, и они относятся только друг к другу.

  1. Расширить виджет
  2. Дайте ему идентификатор и добавьте его в конструктор [убедитесь, что он единственный в своем роде]
  3. Реализация класса слушателя.
  4. создайте новый экземпляр слушателя каждый раз, когда вы создаете элемент такого же типа.
  5. Я предполагаю, что есть определенные объекты, связанные с виджетами. Если это так, сохраните HashMap.

Да пребудет с тобой сила

1 голос
/ 14 января 2013

Мне кажется, что вы пытаетесь использовать один слушатель для нескольких кнопок, если только несколько кнопок не имеют одинаковую функцию, они должны иметь разных слушателей.

В общем, вы должны стараться иметь одного слушателя на функцию вместо одного слушателя на «генератор событий».

Если у вас есть, например, кнопка выхода из системы, она может иметь прослушиватель из LoginStatusWidget (отображающий, как клиент вошел в систему) и прослушиватель из объекта, отвечающего за отслеживание сервера выхода из системы.

Служит для отделения компонентов друг от друга.

0 голосов
/ 10 августа 2013

Не могли бы вы просто сделать:

final Button source= new Button("My Button");

button.addClickHandler(new ClickHandler() {
   @Override
   public void onClick(ClickEvent event) {
         doSomething(source);
   }
}

Обратите внимание, что экземпляр кнопки должен быть помечен как окончательный.

0 голосов
/ 14 января 2013

Сначала я рекомендую вам попытаться собрать ваши кнопки и их ClickHandlers в одном классе, но если в вашем случае это невозможно, у меня есть для вас предложение:

Когда вы создаете свою кнопку, вы можете добавить к ней некоторую информацию:

Button button = new Button("submit");
button.setLayoutData(someObj);

И после запуска события вы можете получить свою кнопку из события в вашем ClickHandler и узнать, какая это кнопка:

Button button = (Button) event.getSource();
MetaData someObj = (MetaData) button.getLayoutData(); 
...