2011-11-07 1 views

risposta

15

Devi solo convalidare l'input degli utenti su un determinato evento. Può essere ad es. su ogni tasto (KeyPressEvent), quando il TextBox perde lo stato attivo (ValueChangeEvent), su un pulsante, premere (ClickEvent) e così via. Implementa un gestore di eventi, ad es. KeyPressHandler e registra la tua implementazione con il TextBox. Quindi nel gestore si convalida il valore del TextBox e se contiene qualcosa di diverso dai numeri, si ritorna dal metodo, probabilmente in qualche modo dicendo all'utente che il valore non era valido.

Qualcosa di simile a questo:

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

Se si dispone di un sacco di convalida da fare, probabilmente si desidera introdurre un quadro di riferimento di convalida, che consente di risparmiare da un sacco di reinventare la ruota. Ci possono essere alternative migliori al giorno d'oggi, ma personalmente sono stato abbastanza soddisfatto con lo GWT-VL validation framwork.

+0

A proposito, questo è roba piuttosto di base e dovresti essere in grado di risolvere questo problema con un po 'di googling. – toman

+6

Qualsiasi motivo particolare per non utilizzare GWT ValueBox , DoubleBox, IntegerBox o LongBox con tutte le convalide, la formattazione e il supporto I18N !!! – SSR

+2

eseguirà il backspace con questo .. e la navigazione con il tasto Tab ..? – knocker

11

Quanto segue è un approccio più generico e consente il riutilizzo del codice. Puoi utilizzare il gestore NumbersOnly per qualsiasi casella di testo (della stessa classe) che desideri.

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

come verranno gestiti backspace e tasto tab? – knocker

+0

@knocker - Questo impedirà il backspace, la scheda, copia/incolla, home/end, seleziona tutto e invio da funzionare correttamente. cancelKey chiama preventDefault dietro le quinte. Mentre questa soluzione funziona parzialmente, è molto limitata. – 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

Il tasto backspace non funziona per me utilizzando questo codice in Firefox e Safari (non ne ho testato altri) su GWT 2.5. Anche questo non funzionerà con copia/incolla, i tasti freccia, home/end o seleziona tutto. – sixtyfootersdude

4

ho aggiunto altre eccezioni, ad esempio la possibilità di copiare il numero. Impedisce ancora l'incollatura di cose dagli appunti.

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

Provate questo:

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

Sostituisci il tuo TextBox sia con un IntegerBox o LongBox.

Questo non è semanticamente uguale a consentire solo cifre, ma è discutibilmente migliore nella maggior parte dei casi di utilizzo. Si otterrà anche l'analisi di interi in e out effettuata gratuitamente.

+0

Tuttavia, non impedirà di copiare i valori non numerici. – Stultuske