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?

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top