Подтвердить что ты не робот

Разрешить только номера в текстовом поле в GWT?

У меня есть требование, когда мне нужно разрешить только цифры в текстовом поле. если пользователь пытается ввести любой другой символ, отличный от цифр, нам нужно отменить событие. Пожалуйста, помогите мне, как достичь этого?

Спасибо!

4b9b3361

Ответ 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();
    }
}