Верните jTextField к последнему правильному значению

У меня есть InputVerifier для jTextField проверить и посмотреть, является ли ввод от пользователя целым числом. Если это не так, я хочу вернуть его к последнему хорошему значению. Как мне к этому? Вот код, который у меня есть:

class IntegerVerifier extends InputVerifier {

    public boolean verify(JComponent input) {
            JTextField text = (JTextField)input;
            String old = text.getText();
        try {
            Integer.parseInt(text.getText().trim());
        } catch (NumberFormatException e) {
            // this does not work b/c input is not a TextField
            input.setText(old); 
        }
        return true;
    }

}

РЕДАКТИРОВАТЬ: Ниже то, что я в конечном итоге использовал в качестве решения. Сначала я попробовал это, но оказалось, что это не работает. Я обнаружил, что ошибка была в тестировании. Я попытался изменить текстовое поле на недопустимое значение сразу после запуска графического интерфейса, но это бы очистило поле. Тем не менее, текстовое поле было сосредоточено сразу после запуска графического интерфейса, поэтому его начальное значение было нулевым, я думаю. Последующие изменения вели себя как ожидалось.

class IntegerVerifier extends InputVerifier {
    public boolean verify(JComponent input) {
        JTextField text = (JTextField) input;
        String old = text.getText();
        try {
            Integer.parseInt(text.getText().trim());
        } catch (NumberFormatException e) {
            text.setText(old);
            //return false; // don't use this otherwise it won't revert the value
        }
        return true;
    }
}

2 ответа

Решение

Ваш вопрос указывает на другую проблему, это комментарий в вашем коде. Вы должны сохранить старое значение после его проверки и вернуть его обратно, если текущий ввод недействителен. Вам следует позвонить text.setText() и не input.setText(), Что-то вроде этого:

class IntegerVerifier extends InputVerifier {
    String lastGood = "";
    public boolean verify(JComponent input) {
        JTextField text = (JTextField)input;
        String value = text.getText().trim();
        try {
            Integer.parseInt(value);
            lastGood = value;
        } catch (NumberFormatException e) {
            text.setText(lastGood);
            // assumed it should return false
           return false;
        }
        return true;
    }
}

Вместо прохождения JComponentПросто передайте строковое значение.

Другие вопросы по тегам