Gestionnaire d’événement personnalisé GWT

Quelqu’un peut-il me donner un exemple de création d’un ensemble personnalisé d’un événement et d’un gestionnaire. Disons que vous avez un object Person que vous voulez que vos widgets sachent s’il a été mis à jour.

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

La plupart des événements sont basés sur DOM, tandis que je souhaite 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.

Voici un exemple assez complet de création d’un événement personnalisé, repris textuellement à partir du wiki GwtEventSystem (lorsque le système d’événements était encore dans l’incubateur de GWT).

C’est un événement qui se déclenche lorsque l’utilisateur devient heureux.

Définir une nouvelle classe d’événement. Vous pouvez append des métadonnées arbitraires dans la classe d’événement. Pour simplifier, nous n’en inclurons pas ici.

public class HappyEvent extends GwtEvent { ... } 

Définissez une nouvelle interface de gestionnaire et de marqueur pour la classe d’événement.

 interface HappyHandler extends EventHandler { public void onHappiness(HappyEvent event); } interface HasHappyEvents { public HandlerRegistration addHappyHandler(HappyHandler handler); } 

Ajouter un type d’événement unique

 class HappyEvent extends AbstractEvent{ public static AbstractEvent.Key KEY = new AbstractEvent.Key(){...} public GwtEvent.Key getKey(){ return KEY; } ... } 

Câbler la méthode de tir du gestionnaire

 class HappyEvent extends GwtEvent { static Key KEY = new Key(){ protected void fire(HappyHandler handler, HappyEvent event) { handler.onHappiness(event); }; ... } 

Merci pour toutes les réponses. Zakness a été le plus proche de me donner la réponse dont j’avais besoin, cependant, j’ai proposé un modèle légèrement plus simple.

Mon objective principal était d’éviter d’utiliser une variable statique dans ma structure de données principale. J’ai également rencontré le problème d’essayer de déterminer si cette structure de données principale avait été extraite de la firebase database au moment où elle tentait d’y accéder et de savoir quoi faire (si elle était nulle).

Après avoir vu l’ architecture de Google Web Toolkit: Meilleures pratiques pour l’architecture de la vidéo de votre application GWT à 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.


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

Passons maintenant à la classe Event. Cela m’a donné le plus de problèmes:

 public class CategoryChangeEvent extends GwtEvent { private final List category; public CategoryChangeEvent(List category) { super(); this.category = category; } public static final Type TYPE = new Type(); @Override protected void dispatch(CategoryChangeHandler handler) { handler.onCategoryChange(this); } @Override public com.google.gwt.event.shared.GwtEvent.Type getAssociatedType() { return TYPE; } public List getCategories(){ return category; } } 

Maintenant, je peux utiliser ces classes Handler et Event comme si cette structure de données principale était rechargée:

Ce code a la structure de données et souhaite informer tout le monde que celui-ci 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 categories = event.getCategories(); populateCategories(categories); } } 

En voici un exemple sur le blog d’Alex Reid, incluant un lien vers un exemple de code opérationnel . L’exemple remplit certains des bits flous et, avec l’exemple de Nick ici, aide à clarifier le début de l’architecture d’un bus d’événements dans votre application gwt.

Je pense que l’exemple le plus complet et détaillé se trouve dans cet article

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

Créer des événements GWT personnalisés en utilisant le HandlerManger ne devrait pas être si difficile, regardez l’exemple GwtEventBus @ NingZhang.info, il est vraiment intuitif. Les principales classes utilisées sont:

  • com.google.gwt.event.shared.HandlerManager
  • com.google.gwt.event.shared.GwtEvent
  • com.google.gwt.event.shared.EventHandler

Un commentaire supplémentaire: si vous essayez de faire quelque chose de similaire pour réagir dans une application principale à un événement déclenché depuis un composant graphique personnalisé (comme un composite, etc.), je pense que vous devez connecter l’application principale explicitement 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ée.

On dirait que vous voulez le support de PropertyChange *. Regardez gwtx . Google ‘gwt PropertyChange’ et vous obtiendrez plusieurs blogs expliquant comment l’utiliser.

Vous voudrez peut-être jeter un oeil à ValueChangeHandler et ValueChangeEvent dans GWT 1.6. Celles-ci pourraient fonctionner pour ce que vous essayez de faire.