Лучшая практика обработки событий GWT
Я совершенно новичок в дизайне интерфейсов и пытаюсь понять, как лучше всего обрабатывать события. В прямом случае обработчика и (в данном случае) кнопок, вызывающих событие, относящееся к одному классу, это нормально, я понял. Обработчик может видеть кнопки, чтобы он мог сказать:
if (event.getSource() == myButton)
а также, обработчик находится в том же классе, поэтому он может добавлять вкладки к объекту, локальному для этого класса или подобному.
Проблема: я не знаю, как мне поступить со случаем, когда обработчики и генераторы событий находятся в разных классах.
например
Из моего основного класса макета я создаю и показываю собственный диалог. Этот диалог реализован в своем собственном классе. В идеале диалог должен использовать обработчик из основного класса макета (он реализует ClickHandler), что было бы хорошо, но в моем приложении есть несколько разных ClickEvents. Я различаю их, как указано выше, проверяя источник. В этом случае кнопки находятся в диалоговом классе, поэтому я не могу просто сказать:
if (event.getSource() == myDialogbutton)
как myDialogButton не находится в области видимости.
Любые советы о том, как это должно работать, будут оценены.
D
5 ответов
Возможно, я могу помочь вам с моим решением...
Я унаследовал 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, для команд, для всего остального, что мне нужно передать данные.
Надеюсь, это вам немного помогло.
Попробуйте создать новый слушатель для каждого анонимного или последовательного виджета, например, кнопку в FlexTable. Таким образом, их жизненные циклы связаны, и они относятся только друг к другу.
- Расширить виджет
- Дайте ему идентификатор и добавьте его в конструктор [убедитесь, что он единственный в своем роде]
- Реализуйте класс слушателя.
- создавайте новый экземпляр слушателя каждый раз, когда вы создаете элемент такого же типа.
- Я предполагаю, что есть определенные объекты, связанные с виджетами. Если это так, сохраните HashMap.
Да пребудет с тобой сила
Мне кажется, что вы пытаетесь использовать один слушатель для нескольких кнопок, если только несколько кнопок не имеют одинаковую функцию, они должны иметь разных слушателей.
В общем, вы должны стараться иметь одного слушателя на функцию вместо одного слушателя на "генератор событий".
Если у вас есть, например, кнопка выхода из системы, она может иметь прослушиватель из LoginStatusWidget (отображающий, как клиент вошел в систему) и прослушиватель из объекта, отвечающего за отслеживание сервера выхода из системы.
Он будет служить для отделения компонентов друг от друга.
Сначала я рекомендую вам попытаться собрать ваши кнопки и их ClickHandlers в одном классе, но если в вашем случае это невозможно, у меня есть для вас предложение:
Когда вы создаете свою кнопку, вы можете добавить к ним некоторую информацию:
Button button = new Button("submit");
button.setLayoutData(someObj);
И затем после запуска события вы можете получить свою кнопку из события в вашем ClickHandler и выяснить, какая это кнопка:
Button button = (Button) event.getSource();
MetaData someObj = (MetaData) button.getLayoutData();
Вы не можете просто сделать:
final Button source= new Button("My Button");
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
doSomething(source);
}
}
Обратите внимание, что экземпляр кнопки должен быть помечен как окончательный.