web-dev-qa-db-fra.com

Activation d'un événement de clic à partir du code dans gwt

J'ai créé un widget personnalisé dans gwt qui étend le composite. J'utilise le panneau de focus dans ce contexte. -vous déclencher un événement clic en utilisant 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

21
DonX

Je ne l'ai pas fait pour un événement clic, mais j'ai déjà modifié des événements comme celui-ci.

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

La [createClickEvent] ( http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/domient/document.html#createClickEvent(int,%20int,%20int ,% 20int,% 20int,% 20boolean,% 20boolean,% 20boolean,% 20boolean)) nécessite cependant beaucoup plus de paramètres.

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

J'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 car vous êtes dans un autre gestionnaire d'événements.

20
Rod

Vous pouvez également utiliser une simple méthode JSNI pour le faire. Il suffit de passer votre élément [par exemple. button.getElement ()] à cette méthode:

public static native void clickElement(Element elem) /*-{
    elem.click();
}-*/;
15
11101101b

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

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

Veuillez noter que KeyPressHandler ne fonctionne pas dans Firefox pour les touches spéciales telles que ENTER, vous devrez utiliser KeyUp ou KeyDown.

http://code.google.com/p/google-web-toolkit/issues/detail?id=5558#c6

2
Carlos Aguayo

La méthode décrite par DLH devrait fonctionner et à l'exception de l'argument detail (ce que je ne sais pas à quoi ça sert), vous avez les autres arguments disponibles dans KeyPressEvent.

Une autre solution possible consiste à appeler la click() JavaScript native sur l'élément. Je l'ai fait dans un widget Button (disponible en open 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 de la méthode de clic spécifiques au navigateur.

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

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

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

2
Hilbrand Bouwkamp

Peut-être que ClickListenerCollection.fireClick () fait ce que vous voulez. Je ne l'ai pas utilisé bien

Désolé, c'est obsolète et peut-être même pas utile. Je suppose que vous devriez plutôt regarder widget.delegateEvent.

1
HerdplattenToni

Vous pouvez simplement faire ceci:

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