2010-04-06 4 views
6

J'écris un widget avec le balisage suivant:GWT UiHandler sur HTMLPanel

<g:HTMLPanel ui:field="shortcutPanel" styleName="{style.shortcut}"> 
    <g:Image ui:field="shortcutImage"></g:Image> 
    <span ui:field="shortcutLabel"></span> 
</g:HTMLPanel> 

donc essentiellement une div qui enveloppe et de l'image et une étiquette. Maintenant, au lieu d'ajouter les gestionnaires d'événements sur l'image/span, j'aimerais qu'un onClick soit associé au HTMLPanel. Mon problème est cependant que GWT me dit que

shortcutPanel ne pas pas une méthode de addClickHandler associée

Je suppose donc que la différence est que HTMLPanel ne met pas en œuvre HasClickHandlers ou quelque chose que ligne. Je me demande alors quel est le moyen standard pour attacher un gestionnaire de clic à un élément Ui tel qu'un HTMLPanel ou mieux encore, y at-il un tel Widget GWT qui est essentiellement un wrapper div auquel je peux facilement attacher des événements avec le @UiHandler annotation.

Répondre

20

Vous cherchez probablement FocusPanel - il a tous les goodies: HasAllFocusHandlers, HasAllKeyHandlers, HasAllMouseHandlers, HasBlurHandlers, HasClickHandlers .... pour ne citer que quelques-uns :) Je trouve qu'il est le plus facile et le meilleur pour attacher des gestionnaires de clic à un panneau.

+4

Cela a fonctionné Merci! J'ai dû modifier mon balisage pour avoir un FlowPanel directement sous le FocusPanel qui enveloppe l'étiquette et l'image, puisque FlowPanel est un SimplePanel et ne peut avoir qu'un seul widget. Autre que cela, a travaillé comme un charme.Mon seul boeuf est qu'il produit un peu de balisage supplémentaire, inutile dont je ne suis pas un fan, mais je me rends rapidement compte que les gens ne semblent pas s'en soucier dans le monde de GWT. – brad

7

Je ne l'ai pas fait cela avant, mais vous pouvez faire ce qui suit:

  • Créer une classe personnalisée MyPanel qui étend HTMLPanel et met en œuvre HasClickHandlers
  • Ajoutez la méthode suivante dans MyPanel.java
public HandlerRegistration addClickHandler(ClickHandler handler) { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 
  • Remplacez ensuite HTMLPanel avec MyPanel dans votre fichier ui.xml et son implémentation Java correspondante.

Vous pouvez toujours regarder l'implémentation de HTMLTable pour comprendre comment fonctionne la propagation d'événements. C'est un Panel et implémente HasClickHandlers.

+0

merci cool, je vais essayer que quand j'ai une chance – brad

2

superbe, cela fonctionne.

public class LiPanel extends HTMLPanel implements HasClickHandlers { 

    LiPanel() { 
     super("li", ""); 
    } 

    @Override 
    public HandlerRegistration addClickHandler(ClickHandler handler) { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 

} 
1

Si vous souhaitez utiliser l'annotation @UiHandler pour enregistrer des gestionnaires d'événements pour votre widget personnalisé, vous devez re-mettre en œuvre les méthodes de addXXHandler. Le compilateur GWT ne semble pas trouver ceux dans les superclasses. par exemple. si vous voulez utiliser

@UiHandler("myCustomWidget") 
public void handleWidgetSelectionChangeEvent(final SelectionEvent<CountryDts> event) { 
... 
} 

et votre CustomWidget étend une classe pour laquelle cela fonctionne, vous devrez peut-être ajouter l'interface HasSelectionHandlers explicitement à votre classe:

public class CustomComboBox<D> extends ComboBox<D> implements HasSelectionHandlers<D> { 

    @Override 
    @SuppressWarnings("pmd.UselessOverridingMethod") 
    public HandlerRegistration addSelectionHandler(final SelectionHandler<D> handler) { 
     // GWT Compile doesn't recognize method in supertype for UIHandler 
     return super.addSelectionHandler(handler); 
    } 
... 
}