2009-08-06 7 views
21

J'ai créé un widget personnalisé dans gwt qui étend le composite.J'utilise le panneau de mise au point dans that.For FocusPanel J'ai ajouté ClickHandler.Then j'ai ajouté le clavier listner.Now sur appuyez sur la touche Entrée cela devrait déclencher click event. Est-ce que quelqu'un peut m'aider à déclencher un événement click en utilisant du code dans GWT?Firing cliquez sur l'événement du code dans gwt

focusPanel.addKeyPressHandler(new KeyPressHandler() { 
      public void onKeyPress(KeyPressEvent event) { 
       if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)  { 
        // TODO call onClick() method 
       } 
      } 
     }); 

Merci

Répondre

18

Je n'ai pas fait cela pour un événement click, mais j'ai fait des changements comme ça.

NativeEvent event = Document.get().createChangeEvent(); 
DomEvent.fireNativeEvent(event, this); 

Le [createClickEvent] (http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/dom/client/Document.html#createClickEvent(int,%20int,%20int,%20int,%20int,%20boolean,%20boolean,%20boolean,%20boolean)) méthode prend beaucoup plus de paramètres bien.

public final NativeEvent createClickEvent(int detail, 
              int screenX, 
              int screenY, 
              int clientX, 
              int clientY, 
              boolean ctrlKey, 
              boolean altKey, 
              boolean shiftKey, 
              boolean metaKey) 
2

La méthode décrite par DLH devrait fonctionner et sauf pour l'argument détail (que je ne sais pas ce qu'il est pour) vous avez les autres arguments disponibles dans le KeyPressEvent

Une autre solution possible est d'appeler le JavaScript natif click() sur l'élément, ce que j'ai fait dans un widget Button (disponible en en source). Voir la méthode click() dans la classe suivante: http://code.google.com/p/cobogw/source/browse/trunk/widgets/src/main/java/org/cobogw/gwt/user/client/ui/Button.java), qui appelle une classe Event2 spécifique, qui implémente les versions spécifiques au navigateur de la méthode click.

Pour utiliser cette méthode, vous pouvez simplement ajouter le fichier jar fourni avec cobogw à votre projet, inclure le Event.gwt.xml et appelez Event2.fireClickEvent(getElement()); dans votre méthode ou seulement utiliser le code des classes event2 et l'événement dans votre propre projet

Cette solution vous permet également de déclencher par programmation un événement click.

Jetez également un coup d'oeil à l'implémentation onBrowserEvent dans la classe Button mentionnée ci-dessus, car elle gère l'événement key de la même manière que vous le souhaitez, et contourne le problème du déclenchement de plusieurs événements clés, lorsque vous voulez seulement générer un événement de clic.

20

Je l'ai fait ce code:

if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)  { 
    myButton.fireEvent(new GwtEvent<ClickHandler>() { 
     @Override 
     public com.google.gwt.event.shared.GwtEvent.Type<ClickHandler> getAssociatedType() { 
     return ClickEvent.getType(); 
     } 
     @Override 
     protected void dispatch(ClickHandler handler) { 
      handler.onClick(null); 
     } 
    }); 
} 

Bien sûr, myButton doit être final ou public parce que vous êtes dans un autre gestionnaire d'événement.

+1

Je pense que la réponse est correcte comme il fait le travail. Cependant, c'est beaucoup de code de plaque de chaudière pour un petit effet. Espérons qu'un jour, Google inclura cela directement dans l'automatisation des tests GWT. – Sebi

+0

Merci beaucoup. Ça marche pour moi. –

+0

fonctionne pour le bouton, mais ne fonctionne pas pour menubar .. :( – knocker

14

Vous pouvez également utiliser une méthode JSNI simple pour le faire. Passez simplement votre élément [par ex. button.getElement()] à cette méthode:

public static native void clickElement(Element elem) /*-{ 
    elem.click(); 
}-*/; 
+1

fonctionne pour le bouton, mais ne fonctionne pas pour menubar .. :( – knocker

2

Si la cible est un bouton, vous pouvez simplement appeler sa méthode click().Sinon, vous pouvez faire quelque chose comme ceci:

private void click(HasHandlers handlerSource) { 
    NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false); 
    DomEvent.fireNativeEvent(event, handlerSource); 
} 
0

Vous pouvez simplement faire ceci:

focusPanel.fireEvent(new ClickEvent(){}); 
+0

'ClickEvent()' a un accès protégé dans 'com.google.gwt.event.dom .client.ClickEvent ' –

+0

@GlenPierce Corriger, mais vous n'appelez pas son constructeur protégé, vous créez une nouvelle classe interne anonyme, et en utilisant son constructeur Essayez le code, vous verrez qu'il se compile bien. – Craigo