43 votes

Gestionnaire d'événements personnalisé GWT

Quelqu'un peut-il me donner un exemple de création d'un ensemble personnalisé d'événement et de gestionnaire? Supposons que vous souhaitiez que vos widgets sachent si un objet Personne 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 le DOM, alors que je veux créer des événements personnalisés et des gestionnaires que je peux déclencher en dehors de tout événement basé sur un navigateur.

31voto

Nick Points 718

Merci pour toutes les réponses. Zakness est venu le plus proche pour me donner la réponse dont j'avais besoin, cependant, je suis venu avec un peu plus simple du modèle.

Mon principal objectif était d'éviter d'utiliser une variable statique à ma structure de données principal. J'ai aussi touché le problème d'essayer de comprendre si la principale structure de données a été extrait de la base de données au moment de la tentative d'accès et que faire quand il n'est pas (c'est à dire quand elle est null).

Après avoir regardé le Google Web Toolkit de l'Architecture: les Meilleures Pratiques Pour la création de l'Architecture de Votre Application GWT vidéo de Google IO, l'Événement de Bus idée semblait parfait.

Je vais poster ma solution ici au cas où il permet à quiconque de sortir.


Tout d'abord, créez la classe de Gestionnaire. Notez la référence à la classe d'Événements déjà:

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

Maintenant, sur les Événements de la classe. Cela m'a donné le plus de fil à retordre:

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 en mesure de les utiliser de Gestionnaire et de classes d'Événements comme lors de cette structure de données principal obtient reloaded:

Ce code a obtenu la structure de données et souhaitez en informer tout le monde qui est à l'écoute qu'il s'est 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);	
	}

}

23voto

Zak Linder Points 166

Voici un joli exemple complet de création d'un événement personnalisé, prise de procès-verbaux du GwtEventSystem Wiki (lorsque le système d'événement était encore en GWT de l'incubateur).

C'est un événement est déclenché lorsque l'utilisateur devient heureux.

Définir une nouvelle classe d'événements. Vous pouvez ajouter l'arbitraire des métadonnées dans le cas de la classe. Pour des raisons de simplicité, nous n'inclura pas d'ici.

public class HappyEvent extends GwtEvent {
  ...
}

Définir un nouveau gestionnaire, et le marqueur de l'interface pour la classe d'événements.

interface HappyHandler extends EventHandler {
  public void onHappiness(HappyEvent event);
}

interface HasHappyEvents {
  public HandlerRegistration addHappyHandler(HappyHandler handler);
}

Ajouter un unique type d'événement

class HappyEvent extends AbstractEvent{
  public static AbstractEvent.Key KEY = new AbstractEvent.Key(){...}

  public GwtEvent.Key getKey(){
    return KEY; 
  }
  ...
}

Fil le gestionnaire du feu de la méthode

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

4voto

tom d Points 101

En voici un exemple sur le blog d’Alex Reid, avec un lien vers un exemple de code opérationnel . L'exemple complète certaines parties floues et, avec l'exemple de Nick ici, permet de mieux comprendre comment démarrer l'architecture d'un bus d'événement dans votre application gwt.

2voto

Rubinsh Points 1634

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 exactement comment utiliser correctement définir des événements personnalisés et utiliser la classe HandlerManager de GWT.

1voto

Ning120 Points 143

Créer des événements GWT personnalisés à l'aide de HandlerManger ne devrait pas être aussi difficile. Jetez un coup d'œil à l'exemple GwtEventBus @ NingZhang.info, il est très intuitif. Les classes de clés utilisées sont:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X