Вопрос
Как виджеты в GWT должны информировать другие виджеты о необходимости обновить себя или выполнить какое-либо другое действие?
Должен ли я использовать sinkEvent / onBrowserEvent?И если да, то есть ли способ создавать пользовательские события?
Решение
Я решил эту проблему, используя Шаблон наблюдателя и центральный Контроллер.Центральный контроллер - это единственный класс, который обладает знаниями обо всех виджетах в приложении и определяет, как они сочетаются друг с другом.Если кто-то что-то меняет в виджете A, виджет A запускает событие.В eventhandler вы вызываете центральный контроллер через вызов 'notifyObservers()', который информирует центральный контроллер (и, возможно, другие, но для простоты я не буду вдаваться в подробности) о том, что произошло определенное действие (передача экземпляра перечисления 'MyEvent').
Таким образом, логика потока приложения содержится в одном центральном классе, и виджетам не нужны спагетти ссылок друг на друга.
Другие советы
Это очень открытый вопрос - например, вы могли бы создать свой собственный класс статического обработчика событий, на который подписываются виджеты.например,:
Class newMessageHandler {
void update(Widget caller, Widget subscriber) {
...
}
}
customEventHandler.addEventType("New Message", newMessageHandler);
Widget w;
customEventHandler.subscribe(w, "New Message");
...
Widget caller;
// Fire "New Message" event for all widgets which have
// subscribed
customEventHandler.fireEvent(caller, "New Message");
Где CustomEventHandler отслеживает все виджеты, подписывающиеся на каждое именованное событие, и вызывает метод update для именованного класса, который затем может вызывать любые дополнительные методы, которые вы хотите.Возможно, вы захотите вызвать unsubscribe в деструкторе - но вы могли бы сделать это настолько причудливо, насколько захотите.
Итак, вот моя (примерная) реализация, сначала давайте создадим новое событие:
import java.util.EventObject;
import com.google.gwt.user.client.ui.Widget;
public class NotificationEvent extends EventObject {
public NotificationEvent(String data) {
super(data);
}
}
Затем мы создаем интерфейс обработчика событий:
import com.google.gwt.user.client.EventListener;
public interface NotificationHandler extends EventListener {
void onNotification(NotificationEvent event);
}
Если у нас теперь есть виджет, реализующий функцию Notificationhanler, мы можем запустить событие, вызвав:
((NotificationHandler)widget).onNotification(event);