У меня есть требование, когда мне нужно разрешить только цифры в текстовом поле. если пользователь пытается ввести любой другой символ, отличный от цифр, нам нужно отменить событие. Пожалуйста, помогите мне, как достичь этого?
Спасибо!
У меня есть требование, когда мне нужно разрешить только цифры в текстовом поле. если пользователь пытается ввести любой другой символ, отличный от цифр, нам нужно отменить событие. Пожалуйста, помогите мне, как достичь этого?
Спасибо!
Вам просто нужно проверить вход пользователей на определенное событие. Это может быть, например, при каждом нажатии клавиши (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.
Ниже приведен более общий подход и позволяет повторно использовать код. Вы можете использовать обработчик 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();
}
}
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();
}
}
}
Я добавил другие исключения, например, возможность скопировать номер. Он все еще предотвращает вставку вещей из буфера обмена.
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();
}
}
}
Замените свой TextBox либо IntegerBox, либо LongBox.
Это не семантически то же самое, что и только цифры, но в большинстве случаев это возможно лучше. Вы также получите бесплатный синтаксический анализ ввода и вывода.
Попробуйте следующее:
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();
}
}