2009-08-06 13 views
21

He creado un widget personalizado en gwt que amplía el compuesto. Estoy usando el panel de enfoque en eso. Para FocusPanel agregué ClickHandler. Luego agregué el listner de teclado. Ahora al presionar la tecla Enter debería desencadenar un evento de clic. ¿Puede alguien ayudarme a activar el evento de clic usando el código en GWT?Evento de clic de encendido del código en gwt

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

Gracias

Respuesta

18

No he hecho esto para un evento de clic, pero he hecho cambios como este.

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

El [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étodo necesita mucho más parámetros embargo.

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

El método descrito por DLH debería funcionar y excepto por el argumento de detalle (que no tengo ni idea de lo que es todo por) tiene los otros argumentos disponibles en KeyPressEvent.

Otra posible solución es llamar al JavaScript nativo click() en el elemento. He hecho esto en un widget de botón (que está disponible como op en fuente). Vea el método click() en la siguiente clase: http://code.google.com/p/cobogw/source/browse/trunk/widgets/src/main/java/org/cobogw/gwt/user/client/ui/Button.java), que llama a una clase específica de Evento2, que implementa las versiones específicas del navegador del método de clic.

Para utilizar este método, usted puede simplemente añadir el archivo jar provisto con cobogw a su proyecto, incluya el Event.gwt.xml y llame Event2.fireClickEvent(getElement()); en su método o sólo utilizan el código de las clases EVENT2 y eventos en su propio proyecto

Esta solución también le permite disparar un evento de clic mediante programación.

También consulte la implementación onBrowserEvent en la clase Button mencionada anteriormente, ya que maneja el evento clave de forma similar a como lo desea, y soluciona el problema del disparo de múltiples eventos clave, cuando solo desea generar un evento de 1 clic.

20

he hecho este código:

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); 
     } 
    }); 
} 

Por supuesto, myButton debe ser final o público porque se encuentra dentro de otro controlador de eventos.

+1

Creo que esa es la respuesta correcta, ya que hace el trabajo. Sin embargo, esto es mucho código de placa de caldera para un efecto pequeño. Con suerte, un día Google incluirá eso directamente en la automatización de pruebas GWT. – Sebi

+0

Muchas gracias. Esto funciona para mi. –

+0

funciona para el botón, pero no funciona para la barra de menú .. :( – knocker

14

También puede usar un método JSNI simple para hacerlo. Solo pase su elemento [p. button.getElement()] para este método:

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

funciona para el botón pero no funciona para la barra de menú .. :( – knocker

2

Si el objetivo es un botón que puede simplemente llamar a su método click().De lo contrario, puede hacer algo como esto:

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

Sólo puede hacer esto:

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

'ClickEvent()' tiene acceso protegido en 'com.google.gwt.event.dom .client.ClickEvent ' –

+0

@GlenPierce Correcto, pero no está llamando a su constructor protegido, está creando una nueva clase interna anónima y está usando su constructor. Pruebe el código, verá que compila bien. – Craigo

Cuestiones relacionadas