2011-11-07 56 views

回答

15

您只需驗證某個事件的用戶輸入。它可以是例如每次按鍵(KeyPressEvent),當TextBox失去焦點時(ValueChangeEvent),按下按鈕(ClickEvent)等等。你實現一個事件處理程序,例如KeyPressHandler並使用TextBox註冊您的實現。然後在您的處理程序中驗證TextBox值,如果它包含除數字之外的其他內容,則只需從該方法返回,可能以某種方式告訴用戶該值無效。

事情是這樣的:

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

如果你有很多的驗證做,你可能要爲大家介紹一些驗證框架,把你從大量的重新發明輪子的。現在可能有更好的選擇,但是我個人對GWT-VL validation framwork相當滿意。

+0

順便說一句,這是非常基本的東西,你應該能夠通過一點點谷歌搜索來解決這個問題。 – toman

+6

不使用GWT ValueBox ,DoubleBox,IntegerBox或LongBox以及所有驗證,格式化和I18N支持的任何特定原因! – SSR

+2

將退格工作與此..和導航使用Tab鍵..? – knocker

11

以下是更通用的方法,並允許重複使用代碼。您可以使用NumbersOnly處理程序來處理您希望的任何文本框(同一個類)。

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

如何處理退格鍵和製表鍵? – knocker

+0

@knocker - 這將防止退格,選項卡,複製/粘貼,主頁/結束,選擇全部並從正常工作中輸入。 cancelKey調用preventDefault在幕後。雖然這種解決方案部分起作用,但它非常有限。 – 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

在Firefox和Safari中使用此代碼(尚未測試其他人)在GWT 2.5上使用退格鍵不起作用。這也不適用於複製/粘貼,箭頭鍵,主頁/結束或全選。 – sixtyfootersdude

4

我添加了其他的例外,例如拷貝數的可能性。它仍然阻止從剪貼板粘貼東西。

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

試試這個:

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

與任何一個IntegerBoxLongBox更換你的TextBox。

這在語義上與僅允許數字的語義不同,但在大多數使用情況下可以說它更好。 您還可以免費進行輸入和輸出整數解析。

+0

儘管如此,它不會阻止您複製粘貼非數字值。 – Stultuske

相關問題