Как ограничить пользователя вводом только цифр? - PullRequest
0 голосов
/ 23 марта 2012

В настоящее время я создаю этот графический интерфейс Java, который попросит пользователя ввести 10 записей, а затем использовать значения для выполнения следующего действия.

Я хочу, чтобы внутри были введены только цифры или десятичная точка, так чтоможет быть только значением с плавающей запятой.

Если это не число или десятичная точка, он должен предложить пользователю снова ввести эту конкретную запись перед выполнением следующего действия.

Как мне это сделатьэто?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Wong,

не уверен, используете ли вы Swing или нет ...

Много лет назад у меня была такая же проблема, и я решил ее, создав класс RestrictedTextField, расширяющий JTextField.В конструктор я добавил слушателя ключа (addKeyListener (new RestrictedKeyAdapter ());)

private class RestrictedKeyAdapter extends KeyAdapter {

    @Override
    public void keyReleased(KeyEvent e) {

        if (getText().equals("")) {
            oldString = "";
            return;
        } else {
            // if you cannot parse the string as an int, or float, 
            // then change the text to the text before (means: ignore
            // the user input)
            try {
                if (type.equals("int")) {
                    int i = Integer.parseInt(getText());
                    oldString = getText();
                } else if (type.equals("float")) {
                    float f = Float.parseFloat(getText());
                    oldString = getText();
                } else {
                    // do nothing
                }
            } catch (NumberFormatException el) {
                setText(oldString);
            }

            // if the text is identical to the initial text of this
            // textfield paint it yellow. If the text was changed
            // paint it red.
            if (initialString.equals(getText())) {
                setForeground(Color.YELLOW);
            } else {
                setForeground(Color.RED);
            }
        }
    }
}

Идея состоит в том, что каждый раз, когда пользователь нажимает клавишу в текстовом поле (и затем ее отпускает),текст в текстовом поле анализируется.Например, если компонент должен принимать только числа с плавающей точкой, он пытается проанализировать его как число с плавающей точкой (Float.parseFloat (..)).Если этот анализ успешен, все хорошо.Если синтаксический анализ не выполняется (генерируется исключение NumberFormatException), тогда старый текст записывается обратно в текстовое поле (буквально игнорируя ввод пользователя).

Я думаю, что вы можете добавить KeyAdapter непосредственно в JTextField, не создавая выделенный классдля этого, но с этим решением вы можете вспомнить исходную строку и старую строку.

вы можете поиграться с кодом .. вы можете изменить цвет текстового поля, если ввод действителен или нет (или как в моем фрагменте кода, если текст идентичен исходной строке).

один дополнительный комментарий: я установил «тип» текстового поля в переменной с именем «тип», которая представляет собой просто строку со значениями «int», «float» и т. Д .... лучшерешение было бы здесь, например, перечисление конечно ...

Я надеюсь, что это полезно ...

Тимо

1 голос
/ 23 марта 2012

Существуют различные варианты того, что вы хотели бы сделать. Вы можете проверить здесь для одного примера этого. Другим примером может быть использование форматированных текстовых полей, как показано здесь .

С другой стороны, после отправки вы можете попытаться проанализировать значение до float или double. Если вы получаете какие-либо исключения, тогда значение не является числом.

Наконец, вы можете использовать регулярные выражения. Выражение типа ^\\d+(\\.\\d+)?$ должно соответствовать любому целому числу или числу с плавающей запятой.

...