2011-11-07 94 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

相关问题