Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSpinner: проверить валидность ввода. Нецелые числа в разных локалях. 
V
    Опции темы
Real McCoy
Дата 21.2.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: 2
Всего: 2



Здравствуйте все!

Есть проблема, мне надо найти направление мыслей, чтобы её решить smile Самому пока никакого решения в голову не приходит.

На форме есть JSpinner для ввода нецелых чисел. В системе стоит русская локаль, т.е. десятичный разделитель - запятая. При неправильном вводе в поле спиннера, он просто сбрасывает значение к предыдущему успешному, а так как на форме много контролов, то необходимо, чтобы было ещё какое-нибудь сообщение о неправильном вводе.

Сейчас решаю это след. образом: ловлю уход фокуса с поля ввода спиннера и пытаюсь преобразовать введённое в него значение:
Код

  double value = Double.parseDouble(text);

если бросается исключение, значит ввод неправильный.

Проблема проявляется вот как:
  • если пользователь ввёл значение с десятичной точкой, например "4.5", спиннер не сбрасывает значение на предыдущее, а устанавливает в "4"; парсинг строки "4.5" в число исключения не бросает;
  • если пользователь ввёл значение с десятичной запятой, например "3,8", принимает введённое как есть (т.е. "3,8"; парсинг строки "3,8" в число бросает исключение;

Не могу придумать, как это всё упорядочить. Пример кода мне не требуется, нужна идея, в какою сторону думать.

Спасибо!
PM MAIL   Вверх
dorogoyIV
Дата 22.2.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



нечто подобное я делал для своего "особо одаренного" в компьютерных делах начальника. замучился я с ним, и тупо написал replace(".", ",")  smile 
PM MAIL   Вверх
Real McCoy
Дата 26.2.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: 2
Всего: 2



Всё оказалось ещё сложнее, чем я думал вначале :(

Кто-нибудь знает, ловится ли (и если - да, то как) вот это самое событие, когда спиннер автоматически откатывает значение к предыдущему в случае, когда введено неверное?

Потому что спиннер сам делает всю работу по валидации значений, остаётся только предупредить пользователя, что изменения во поле спиннера были откачены.
PM MAIL   Вверх
Real McCoy
Дата 4.3.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: 2
Всего: 2



Проблема в принципе решена. Не знаю, насколько решение хорошо, но может кому пригодится...

Итак, события редактирования и изменения значения спиннера (JSpinner) происходят не в нём самом, а в текстовом поле его editor'а (((JSpinner.DefaultEditor)spinner.getEditor()).getTextField()). Напомню, что речь идёт о спиннере с числовой моделью (SpinnerNumberModel). При вводе значения, не попадающего в диапазон установленных значений, либо при некорректном вводе (например, буквы вместо цифр), спиннер автоматом откатывает значение к предыдущему после потери фокуса.

Обнаружил, что после неправильного ввода и потери фокуса у поля бросается событие PropertyChangeEvent с именем "editValid" и значениями: новым - true и старым - false. (Кстати, оно же бросается при вводе каждого символа и имеет значение, соответствующее текущему значению поля). При этом эдитор откатывает значение до предыдущего правильного. В случае правильного ввода, после потери фокуса бросается то же событие с именем "value" и старым/новым значениями, соответствующими значению поля спиннера.

Код получился такой:

Код

private boolean focusLost = false;

// ...

JSpinner spinner = ...; Создание и установка спиннера.

javax.swing.JFormattedTextField field = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();

field.addPropertyChangeListener(this);

field.addFocusListener(new FocusListener() 
{
    public void focusGained(FocusEvent e)
    {
        focusLost = false;
    }

    public void focusLost(FocusEvent e)
    {
        focusLost = true;
    }
});

// ...

public void propertyChange(PropertyChangeEvent evt)
{
    String name = evt.getPropertyName();

    if(name.equals("ancestor"))
        return;

    Object oldValue = evt.getOldValue();
    Object newValue = evt.getNewValue();

    if(name.equals("editValid"))
    {
        // Код адаптировался под JDK 1.4 потому не обращайте, плз, внимания
        // на такое корявое преобразование.
        boolean oldVal = new Boolean(oldValue.toString()).booleanValue();
        boolean newVal = new Boolean(newValue.toString()).booleanValue();

        if(focusLost && newVal && !oldVal)
        {
          javax.swing.JOptionPane.showMessageDialog(this.getParent(),
                  "Wrong input in the last edited field. " +
                  "It was rolled back to the previous value.\n\n" +
                  "Probable causes of error:\n" +
                  "- there is no numeric value entered;\n" +
                  "- there is wrong decimal sign used in the number;\n" +
                  "- number entered is out of the field range.", 
                  "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
        } 
    }
}


Надеюсь, кому-нибудь окажутся полезными мои изыскания smile
Всем спасибо!
PM MAIL   Вверх
Mi2Me
Дата 26.2.2012, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.2.2012

Репутация: нет
Всего: нет



Спасибо большое! Мне очень помогло )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.