2010-08-09 6 views
23

J'ai commencé à chercher à utiliser GWT en combinaison avec UiBuilder. Je suis un peu perplexe sur la façon dont vous pouvez utiliser la directive @UiHandler(..) pour rendre le code de handle d'événement simple écrit dans le GWT documentation:Documentation pour @UiHandler

@UiHandler("button") 
void handleClick(ClickEvent e) { 
    Window.alert("Hello, AJAX"); 
} 

Dans ce cas, la méthode handleClick est utilisée. Comment savez-vous pour chaque widget GWT quelles méthodes peuvent être créées avec @UiHandler? Pour certains, vous pouvez également créer une méthode doClose().

Mais que pouvez-vous utiliser avec, par exemple, un ListBox pour obtenir un événement un élément est sélectionné? Où puis-je voir ceci dans la documentation?

Répondre

33

Le paramètre que vous transmettez à l'annotation @UiHandler est le nom du champ approprié que vous souhaitez affecter à *Handler. Donc, dans ce cas, vous attribuez un ClickHandler à un Button button (en fait, nous connaissons simplement le nom du champ). Quant à savoir comment cela fonctionne exactement - cela fait partie de la magie GWT :) Je suppose que, comme tout autre code lié à UiBinder (je pense qu'il y avait une présentation sur Google IO, qui montre le code généré par UiBinder), Au moment de la compilation, le compilateur détermine ce qui se passe où. Dans cet exemple: nous avons un Button button, et nous avons une méthode annotée @UiHandler qui a un paramètre ClickEvent -> que doit signifier qu'il est un ClickHandler (notez que le nom de la méthode ne la matière). Ajoutons donc du code au moment de la compilation (dans le constructeur, probablement) qui ajoute ce gestionnaire au bouton. Si vous êtes intéressé par une réponse plus complète - vérifier la source: D

Mais que pouvez-vous utiliser, pour exemple, un ListBox pour obtenir un événement un élément est sélectionné? Où puis-je voir ceci dans la documentation ?

Dans le GWT API reference. Dans ce cas, vous recherchez probablement ListBox.addChangeHandler. Mais vous habituellement ne trouvez pas @UiHandler code lié là - c'est parce qu'il serait redondant - vous construisez toujours les @UiHandler méthodes de la même façon:

  1. Vous vérifiez le *Handler que vous voulez ajouter, dire ChangeHandler
  2. Il a une void onChange(ChangeEvent event) - donc, votre méthode a besoin d'un paramètre ChangeEvent et devrait ressembler à ceci:

    @UiHandler("listBox") 
    void whateverName(ChangeEvent event) { 
        // ... 
    } 
    
+2

Wow, cela ressemble presque à de la magie. Je n'aurais pas trouvé le genre de comportement générique moi-même. – Roalt

+1

Je vous recommande de regarder les sessions GWT de Google IO 2010 et 2009 (et même 2008) - Les membres de l'équipe GWT montrent et expliquent une partie de cette magie :) –

+0

Kilmer: Merci pour le conseil. Je vais faire ça! – Roalt

1

Votre problème est probablement dans votre méthode onModuleLoad:

public void onModuleLoad() 
{  
    HelloWorld helloWorld = new HelloWorld("BOTAO"); 

    // Using this way @UiHandler will not work 
    //Document.get().getBody().appendChild(helloWorld.getElement()); 

    // correct way 
    RootPanel.get().add(helloWorld); 
} 
+0

Merci! M'a sauvé un mal de tête – Chaos