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