2010-11-06 9 views
32

Mi código:keyPressEvent.getCharCode() devolver 0 para todas las teclas especiales como entrar, pestaña, escapar, etc

@Override 
public void onKeyPress(KeyPressEvent event) 
{ 
    if (event.getCharCode() == KeyCodes.KEY_ENTER) 
    { 
     registerButton.click(); 
    } 
} 

Ésta está unida a un cuadro de texto, y lo hace el fuego cuando se presiona entrar. event.getCharCode() es solo cero, no 13. Cuando presiono tab, es 0, y cuando presiono escape, es 0. Argh!

Esto funcionaba correctamente ayer, y algo ha cambiado en otro lugar del proyecto para afectar esto, pero no estoy seguro de qué podría ser. Realmente parece que no se han realizado cambios relevantes en el último día.

Si, en cambio, manejo un KeyUpEvent, esto funciona como se esperaba.

Estoy usando GWT 2.1.0. Gracias por cualquier idea!

+0

Esta parte parece correcta, ¿podría agregar el resto del código? –

+1

Para aislar el problema, creé una aplicación de muestra con el plugin de Eclipse y agregué un KeyPressHandler al TextBox, ¡crea el mismo problema! Archivé un error en http://code.google.com/p/google-web-toolkit/issues/detail?id=5558&q=rileylark&colspec=ID%20Type%20Status%20Owner%20Milestone%20Summary%20Stars –

+0

que desea evento clave – dlamblin

Respuesta

39

la KeyPressHandler se utiliza por ejemplo para la SHIFT,CTRL, ALT llaves.

Si desea adjuntar un evento a otra tecla, debe usar KeyDownHandler.

nameField.addKeyDownHandler(new KeyDownHandler() { 

    @Override 
    public void onKeyDown(KeyDownEvent event) { 
     if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { 
      Window.alert("hello"); 
     } 

    } 

}); 
+1

Esto funcionó para mí, gracias. Estaba usando KeyPressEvent y detecté que la tecla "enter" presiona correctamente en IE y Chrome, pero no en Firefox (devolvía "0"). Pero esta solución funcionó para mí. – Michael

+0

Sí, KeyPressEvent (y no getNativeKeyCode) me funcionan en Internet Explorer y Chrome, pero no en Firefox [42]. KeyDownHandler y getnativeKeyCode no son necesarios para llegar tan lejos. – cellepo

+0

Pero la respuesta de user2015482 funciona en FF. Esa debería ser la respuesta aceptada! – cellepo

9

o puede probar esta

if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { 
} 
+0

Esto no funcionó para mí. Tuve que cambiar de 'KeyPressHandler' a' KeyDownHandler' (IE y Chrome funcionaban bien, pero Firefox no). – Michael

+2

A pesar de ser elegido por asker, esta no es la respuesta más completa y correcta a la pregunta. En lugar de usar esto, use la respuesta proporcionada por @ Michaël para la funcionalidad de navegador cruzado. –

1

Tengo el mismo problema al actualizar de 2.0.4 a 2.2.1, por lo que parece estar relacionado con el código de GWT.

Parte del problema es que KeyPressedEvent representa un evento de pulsación de tecla nativa (es decir, específica del navegador). En el bug que presentó sobre este tema, uno de los comentarios dice:

Sin embargo, es de esperar que el "escape" no no generar un KeyPressEvent (IE y el comportamiento WebKit); tienes que usar KeyDown o KeyUp para eso. Desafortunadamente Firefox (y Opera) desencadena muchos más eventos de pulsación de teclas que otros (IE y WebKit, que tienen la implementación más sensata, la que el W3C está por estandarizar en Eventos DOM 3, AFAICT), pero en ese caso getCharCode() 0 para que pueda ignorarlos con seguridad. La única excepción (puede haber otras) es la tecla "enter". Los eventos clave/char en los navegadores son un desastre que GWT no hace mucho para homogeneizar las cosas (al menos por ahora).

Hasta que se solucione este problema, la mejor opción es utilizar la solución con KeyDownHandler o KeyUpHandler.

2

Pueden cambiar el comportamiento en FF. Estoy usando GWT 2.4.0 y Firefox 10. De acuerdo con esta comment, usted debe usar algo como abajo antes de que se soluciona el problema:

@Override 
public void onKeyPress(KeyPressEvent event) { 
    int keyCode = event.getUnicodeCharCode(); 
    if (keyCode == 0) { 
     // Probably Firefox 
     keyCode = event.getNativeEvent().getKeyCode(); 
    } 
    if (keyCode == KeyCodes.KEY_ENTER) { 
     // Do something when Enter is pressed. 
    } 
} 
4

keyUpHandler deben utilizarse en lugar de KeyPresshandler.

newSymbolTextBox.addKeyUpHandler(new KeyUpHandler() { 
    @Override 
    public void onKeyUp(KeyUpEvent event) { 
     if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { 
      addStock(); 
     } 
    } 
}); 
+0

Esto funciona y debería ser la respuesta aceptada: también funciona en Firefox. Ver también http://stackoverflow.com/a/5570608/1357094. – cellepo

0

GWT 2.5:

public void onKeyPress(KeyPressEvent event) { 
    if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { 
     // Event 
    } 
} 
+0

Gracias por escribir. ¿Es esto diferente a la respuesta aceptada? –

Cuestiones relacionadas