是否只允许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
}
});