[Java] Gestionnaire d'événements personnalisés GWT


Answers

Merci pour toutes les réponses. Zakness est venu le plus près de me donner la réponse dont j'avais besoin, cependant, j'ai trouvé un modèle un peu plus simple.

Mon objectif principal était d'éviter d'utiliser une variable statique dans ma structure de données principale. J'ai également rencontré le problème de savoir si cette structure de données principale a été récupérée avec succès dans la base de données au moment d'essayer d'y accéder et ce qu'il faut faire quand elle ne l'est pas (c'est-à-dire quand elle est nulle).

Après avoir regardé Google Web Toolkit Architecture: Meilleures pratiques pour l'architecture de votre vidéo GWT App à partir de Google IO, l'idée du bus d'événement semblait parfaite.

Je posterai ma solution ici au cas où cela aiderait quelqu'un d'autre.

D'abord, créez la classe Handler. Notez la référence à la classe Event déjà:

public interface CategoryChangeHandler extends EventHandler {
    void onCategoryChange(CategoryChangeEvent event);
}

Maintenant sur la classe de l'événement. Cela m'a donné le plus de problèmes:

public class CategoryChangeEvent extends GwtEvent<CategoryChangeHandler> {

    private final List<Category> category;

    public CategoryChangeEvent(List<Category> category) {
        super();
        this.category = category;
    }

    public static final Type<CategoryChangeHandler> TYPE = new Type<CategoryChangeHandler>();

    @Override
    protected void dispatch(CategoryChangeHandler handler) {
        handler.onCategoryChange(this);
    }

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<CategoryChangeHandler> getAssociatedType() {
        return TYPE;
    }

    public List<Category> getCategories(){
        return category;
    }

}

Maintenant, je suis capable d'utiliser ces classes Handler et Event quand la structure de données principale est rechargée:

Ce code a obtenu la structure de données et veut informer tous ceux qui écoutent qu'il a été mis à jour:

CategoryChangeEvent event = new CategoryChangeEvent(result);
eventBus.fireEvent(event);

Ce code est une implémentation de l'événement

public class PopulateCategoryHandler implements CategoryChangeHandler {

    @Override
    public void onCategoryChange(CategoryChangeEvent event) {
        tearDownCategories();

        List<Category> categories = event.getCategories();
        populateCategories(categories); 
    }

}
Question

Quelqu'un peut-il me donner un exemple de création d'un ensemble personnalisé d'un événement et d'un gestionnaire. Supposons que vous ayez un objet Personne que vous voulez que vos widgets sachent s'il a été mis à jour.

Vous créez un HandlerManager et maintenant vous devez créer un événement et un gestionnaire. Comment définiriez-vous ces classes afin que vous puissiez vous abonner et déclencher des événements?

La plupart des événements sont basés sur DOM, alors que je veux créer des événements et des gestionnaires personnalisés que je peux déclencher en dehors de tout événement basé sur un navigateur.







Un commentaire supplémentaire: si vous essayez de faire quelque chose de similaire à réagir dans une application principale à un événement déclenché à partir d'un composant graphique personnalisé (comme un composite etc.), je pense que vous devez câbler explicitement l'application principale pour gérer l'événement du composant:

yourComponent.addHandler(this, YourEvent.TYPE);

où "this" est la classe qui implémente votre interface de gestionnaire personnalisé.




Je pense que l'exemple le plus complet et le plus détaillé est dans cet article

Il contient également un exemple de projet qui montre exactement comment utiliser correctement les événements personnalisés et utiliser la classe HandlerManager de GWT.