Виджет, уведомляющий другие виджеты

StackOverflow https://stackoverflow.com/questions/83106

  •  01-07-2019
  •  | 
  •  

Вопрос

Как виджеты в 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top