2011-11-07 21 views

Respuesta

15

Solo tiene que validar la entrada de los usuarios en un evento determinado. Puede ser, p. en cada pulsación de tecla (KeyPressEvent), cuando TextBox pierde el foco (ValueChangeEvent), al presionar un botón (ClickEvent), y así sucesivamente. Implementa un controlador de eventos, p. KeyPressHandler y registrar su implementación con el TextBox. Luego en su controlador valida el valor de TextBox y si contiene algo más que números, simplemente regresa del método, probablemente de alguna manera le dice al usuario que el valor no es válido.

Algo como esto:

final TextBox textBox = new TextBox(); 
textBox.addKeyPressHandler(new KeyPressHandler() { 
    @Override 
    public void onKeyPress(KeyPressEvent event) { 
     String input = textBox.getText(); 
     if (!input.matches("[0-9]*")) { 
      // show some error 
      return; 
     } 
     // do your thang 
    } 
}); 

Si usted tiene una gran cantidad de validación que hacer, es probable que desee introducir algún marco de validación, que le ahorra un montón de reinventar la rueda. Puede haber mejores alternativas hoy en día, pero personalmente he estado bastante satisfecho con el GWT-VL validation framwork.

+0

Por cierto, esto es bastante básico y deberías ser capaz de resolverlo con un poco de googlear. – toman

+6

Cualquier razón particular para no usar GWT ValueBox , DoubleBox, IntegerBox o LongBox con toda la validación, formateo y compatibilidad con I18N !!! – SSR

+2

retrocederá el trabajo con esto .. y la navegación con la tecla Tab ..? – knocker

11

El siguiente es un enfoque más genérico y permite la reutilización de código. Puede usar el controlador NumbersOnly para cualquier cuadro de texto (de la misma clase) que desee.

intbox1.addKeyPressHandler(new NumbersOnly()); 
intbox2.addFocusHandler(new OnFocus()); 


//inner class 
class NumbersOnly implements KeyPressHandler { 
     @Override 
     public void onKeyPress(KeyPressEvent event) { 
      if(!Character.isDigit(event.getCharCode())) 
       ((IntegerBox)event.getSource()).cancelKey(); 
     } 
    } 
+5

cómo se manejará el retroceso y la tecla de tabulación? – knocker

+0

@knocker - Esto evitará retroceso, tabulación, copiar/pegar, inicio/final, seleccionar todo e ingresar para que no funcione correctamente. cancelKey llama a preventDefault detrás de las escenas. Si bien esta solución funciona parcialmente, es muy limitada. – sixtyfootersdude

6
class NumbersOnly implements KeyPressHandler { 

     @Override 
     public void onKeyPress(KeyPressEvent event) { 
      if (!Character.isDigit(event.getCharCode()) 
        && event.getNativeEvent().getKeyCode() != KeyCodes.KEY_TAB 
        && event.getNativeEvent().getKeyCode() != KeyCodes.KEY_BACKSPACE){ 
       ((IntegerBox) event.getSource()).cancelKey(); 
      } 
     } 
    } 
+0

La tecla de retroceso no funciona para mí usando este código en Firefox y Safari (no he probado otros) en GWT 2.5. Esto tampoco funcionará con copiar/pegar, teclas de flecha, inicio/final o seleccionar todo. – sixtyfootersdude

4

I añadieron otras excepciones, por ejemplo, la posibilidad de copiar el número. Todavía impide pegar cosas desde el portapapeles.

public class NumbersOnlyKeyPressHandler implements KeyPressHandler { 
    @Override 
    public void onKeyPress(KeyPressEvent event) { 

     switch(event.getNativeEvent().getKeyCode()) { 
     case KeyCodes.KEY_TAB: 
     case KeyCodes.KEY_BACKSPACE: 
     case KeyCodes.KEY_DELETE: 
     case KeyCodes.KEY_LEFT: 
     case KeyCodes.KEY_RIGHT: 
     case KeyCodes.KEY_UP: 
     case KeyCodes.KEY_DOWN: 
     case KeyCodes.KEY_END: 
     case KeyCodes.KEY_ENTER: 
     case KeyCodes.KEY_ESCAPE: 
     case KeyCodes.KEY_PAGEDOWN: 
     case KeyCodes.KEY_PAGEUP: 
     case KeyCodes.KEY_HOME: 
     case KeyCodes.KEY_SHIFT: 
     case KeyCodes.KEY_ALT: 
     case KeyCodes.KEY_CTRL:break; 
     default: 

      if(event.isAltKeyDown() || (event.isControlKeyDown() && (event.getCharCode() != 'v'&& event.getCharCode() != 'V')) ) 
       break; 

      if(!Character.isDigit(event.getCharCode())) 
        if(event.getSource() instanceof IntegerBox) 
         ((IntegerBox)event.getSource()).cancelKey(); 
     } 
    } 
} 
1

Prueba con esto:

public void onKeyPress(KeyPressEvent event) { 
    if(event.getNativeEvent().getKeyCode()!=KeyCodes.KEY_DELETE && 
     event.getNativeEvent().getKeyCode()!=KeyCodes.KEY_BACKSPACE && 
     event.getNativeEvent().getKeyCode()!=KeyCodes.KEY_LEFT && 
     event.getNativeEvent().getKeyCode()!=KeyCodes.KEY_RIGHT){ 
      String c = event.getCharCode()+""; 
      if(RegExp.compile("[^0-9]").test(c)) 
       textbox.cancelKey(); 
    } 
} 
2

reemplazar su cuadro de texto, ya sea con un IntegerBox o LongBox.

Esto no es semánticamente lo mismo que solo permitir dígitos, pero es posiblemente mejor en la mayoría de los casos de uso. También obtendrá el análisis entero de entrada y salida realizado de forma gratuita.

+0

Sin embargo, no le impedirá copiar pegando valores no numéricos. – Stultuske

Cuestiones relacionadas