我有一个要求,我只需要在文本框中允许数字。如果用户尝试输入除数字以外的任何其他字符,则我们需要取消该事件。请帮我解决这个问题?
谢谢!
答案 0 :(得分: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非常满意。
答案 1 :(得分:12)
以下是更通用的方法,允许代码重用。您可以将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();
}
}
答案 2 :(得分:7)
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();
}
}
}
答案 3 :(得分: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();
}
}
}
答案 4 :(得分:2)
试试这个:
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();
}
}
答案 5 :(得分:2)
将文本框替换为IntegerBox或LongBox。
这在语义上与仅允许数字相同,但在大多数用例中它可以说更好。 您还可以免费获得进出整数解析。
答案 6 :(得分:1)
您可以通过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;
}
您的文本框将是这样
<input class="txtStyle" type="text" autocomplete="off" onkeypress ="return isNumberKey(event);" />
答案 7 :(得分:0)
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;
}
答案 8 :(得分:0)
我遇到了同样的问题(使用的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
}
});