是否只允许GWT中文本框中的数字?

是否只允许GWT中文本框中的数字?,gwt,Gwt,我有一个要求,我需要只允许文本框中的数字。如果用户尝试输入除数字以外的任何其他字符,则需要取消事件。请帮助我如何做到这一点 谢谢 您只需验证用户对某个事件的输入。例如,每次击键(KeyPressEvent)、文本框失去焦点(ValueChangeEvent)、按钮按下(ClickEvent)等都会出现这种情况。您实现了一个事件处理程序,例如KeyPressHandler,并在文本框中注册了您的实现。然后在处理程序中验证TextBox值,如果它包含数字以外的内容,则从方法返回,可能会告诉用户该值无

我有一个要求,我需要只允许文本框中的数字。如果用户尝试输入除数字以外的任何其他字符,则需要取消事件。请帮助我如何做到这一点


谢谢

您只需验证用户对某个事件的输入。例如,每次击键(KeyPressEvent)、文本框失去焦点(ValueChangeEvent)、按钮按下(ClickEvent)等都会出现这种情况。您实现了一个事件处理程序,例如KeyPressHandler,并在文本框中注册了您的实现。然后在处理程序中验证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
    }
});

如果你有很多验证要做,你可能会想引入一些验证框架,这样你就不用再做很多重复的工作了。现在可能有更好的替代方案,但就我个人而言,我非常满意。

以下是一种更通用的方法,允许代码重用。您可以对任何文本框(属于同一类)使用NumberOnly处理程序

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

我添加了其他例外情况,例如复制号码的可能性。它仍然可以防止从剪贴板粘贴内容

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();
        }
    }
}
试试这个:

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

将文本框替换为或

这在语义上与只允许数字不同,但在大多数用例中可以说更好。
您还可以免费完成输入和输出整数解析。

ValueBox不是主要用于过滤输入的。 为什么?因为当用户按下桌面键盘上的键时,会将您的应用程序计数为进入ANR或损坏,是吗? 那不是一部有不同按键的手机,是吗? 因此,这里唯一的解决办法是向人们发出他们输入错误字符的信号,例如红色。 让我提交一个示例代码:

IntegerBox field = new IntegerBox();
        field.setStyleName("number_ok");
    field.addKeyUpHandler(event -> {
        String string = field.getText();
        char[] harfho = string.toCharArray();
        for (char h : harfho) {
            try {
                Integer.parseInt(""+h);
            } catch (NumberFormatException e) {
                field.setStyleName("number_error");
                return;
            }
        }
        field.setStyleName("number_ok");
    });
在css中:

.number_error{
  background-color: red;
}
.number_ok{
  background-color: transparent;
}

您可以通过javascript方法对其进行验证:

function isNumberKey(evt)
       {
          var charCode = (evt.which) ? evt.which : event.keyCode;
          if (charCode != 46 && charCode > 31 
            && (charCode < 48 || charCode > 57))
             return false;

          return true;
       }
函数isNumberKey(evt)
{
var charCode=(evt.which)?evt.which:event.keyCode;
如果(charCode!=46&&charCode>31
&&(字符编码<48 | |字符编码>57))
返回false;
返回true;
}
您的文本框将如下所示

<input class="txtStyle" type="text" autocomplete="off" onkeypress ="return isNumberKey(event);" />

我也遇到了同样的问题(使用一个或多或少都是一样的IntegerBox),我就是这样做的

    fieldName.addKeyPressHandler(new KeyPressHandler() {            
        @Override
        public void onKeyPress(KeyPressEvent event) {
            // Prevent anyone entering anything other than digits here
            if (!Character.isDigit(event.getCharCode())) {
                ((IntegerBox) event.getSource()).cancelKey();
                return;
            }
            // Digits are allowed through
        }
    });

顺便说一句,这是非常基本的东西,你应该能够通过一点谷歌搜索来解决这个问题。不使用GWT ValueBox、DoubleBox、IntegerBox或LongBox以及所有验证、格式化和I18N支持的任何特殊原因!!!退格是否适用于此。。使用Tab键进行导航。默认情况下,至少在2.5.1中,您可以在文本字段中键入gibberish。如果有现成的东西提供此功能,那就太好了。我很确定这不会起作用,因为当此事件触发时,文本框中不会有新字符。我认为你应该改用onKeyUp。如何处理退格和制表键?@knocker-这将阻止退格、制表、复制/粘贴、主页/结束、全选和回车正常工作。cancelKey调用是默认的幕后调用。虽然这个解决方案部分有效,但它是非常有限的。在Firefox和Safari(还没有测试过其他版本)中的GWT2.5中使用此代码时,backspace键对我不起作用。这也不适用于复制/粘贴、箭头键、主页/结束或全选。但它不会阻止您复制粘贴非数值。
    fieldName.addKeyPressHandler(new KeyPressHandler() {            
        @Override
        public void onKeyPress(KeyPressEvent event) {
            // Prevent anyone entering anything other than digits here
            if (!Character.isDigit(event.getCharCode())) {
                ((IntegerBox) event.getSource()).cancelKey();
                return;
            }
            // Digits are allowed through
        }
    });