Виджет, уведомляющий другие виджеты - PullRequest
1 голос
/ 17 сентября 2008

Как виджеты в GWT должны сообщать другим виджетам, чтобы обновить себя или выполнить какое-либо другое действие.

Должен ли я использовать sinkEvent / onBrowserEvent? И если да, есть ли способ создания пользовательских событий?

Ответы [ 3 ]

3 голосов
/ 18 сентября 2008

Я решил эту проблему, используя Шаблон наблюдателя и центральный Контроллер . Центральный контроллер - единственный класс, который знает все виджеты в приложении и определяет, как они сочетаются друг с другом. Если кто-то что-то меняет в виджете A, виджет A запускает событие. В обработчике событий вы вызываете центральный контроллер с помощью вызова notifyObservers (), который сообщает центральному контроллеру (и, возможно, другим, но для простоты, я не буду вдаваться в это) определенное действие (передавая экземпляр перечисления MyEvent) ) произошло.

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

3 голосов
/ 17 сентября 2008

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

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 отслеживает все виджеты, подписывающиеся на каждое именованное событие, и вызывает метод обновления для именованного класса, который затем может вызывать любые дополнительные методы, которые вы хотите. Возможно, вы захотите отменить подписку в деструкторе, но вы можете сделать это так, как вам хочется.

1 голос
/ 19 сентября 2008

Итак, вот моя (примерная) реализация, Сначала давайте создадим новое событие:

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);
}

Если у нас теперь есть виджет, реализующий NotificationHanlder, мы можем вызвать событие, вызвав:

((NotificationHandler)widget).onNotification(event);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...