Pergunta
Como widgets em GWT deve informar outros widgets para refrescar themselfs ou executar alguma outra ação.
Devo usar sinkEvent / onBrowserEvent? E se assim for, há uma maneira para criar eventos personalizados?
Solução
Eu ter resolvido este problema utilizando a Observer padrão e um centro de Controlador . O controlador central é a única classe que tem conhecimento de todos os widgets na aplicação e determina a maneira como eles se encaixam. Se alguém muda algo no widget A, widget Um dispara um evento. No eventhandler você chamar o controlador central através dos notifyObservers () 'chamada, que Informes o controlador central (e, opcionalmente, outros, mas para simplificar eu não estou indo para isso) que uma determinada ação (passando uma instância de 'MyEvent' enum ) ocorreu.
Desta forma, a lógica de fluxo de aplicação está contido em uma única classe central e os widgets não precisa de um espaguete de referências a outra.
Outras dicas
É uma pergunta muito aberta - por exemplo, você pode criar seu próprio evento estático Handler classe quais widgets-se inscrever. por exemplo:
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");
Onde customEventHandler mantém o controle de todos os widgets que subscrevam a cada evento nomeado, e chama o método de atualização na classe chamada, o que poderia, em seguida, chamar quaisquer métodos adicionais que você deseja. Você pode querer chamar unsubscribe no processo de destruição -. Mas você pode torná-lo tão chique como você deseja
Então aqui é o meu (amostra) implementação, primeiro vamos criar um novo evento:
import java.util.EventObject;
import com.google.gwt.user.client.ui.Widget;
public class NotificationEvent extends EventObject {
public NotificationEvent(String data) {
super(data);
}
}
Então vamos criar uma interface de manipulador de eventos:
import com.google.gwt.user.client.EventListener;
public interface NotificationHandler extends EventListener {
void onNotification(NotificationEvent event);
}
Se agora temos um widget implementação do NotificationHanlder, nós podemos disparar o evento chamando:
((NotificationHandler)widget).onNotification(event);