JSpinner с поведением удаления DateFormatter

1

Поэтому я создал spinner с помощью JSpinner.DateEditor, и я немного изменил форматтер, чтобы проверить ввод пользователя.

JSpinner sp1 = new JSpinner(sm);
JSpinner.DateEditor de = new JSpinner.DateEditor(sp1, "hh:mm:ss a");

JFormattedTextField ftf = de.getTextField();
DateFormatter formatter = (DateFormatter) ftf.getFormatter();

formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
sp1.setEditor(de);

Он отлично работает, кроме одного. Например, Время 11:32:12

если я поместил свой курсор перед двоеточием, который находится между 32 и 12. Я получил 11:02:12

но я хочу получить 11:30:12

Любая помощь по этому поводу? благодаря

Теги:
swing
date-format
jspinner

1 ответ

1
Лучший ответ

Основываясь на названии этого вопроса и описываемого поведения, то, что происходит, объясняется в этой строке:

DateFormatter formatter = (DateFormatter) ftf.getFormatter();

formatter.setAllowsInvalid(false); // here is the key

Согласно стандарту DefaultFormatter # setAllowsInvalid() docs:

public void setAllowsInvalid(boolean allowsInvalid)

Устанавливает, разрешено ли редактируемое значение недействительным в течение определенного периода времени (то есть stringToValue ParseException). Часто бывает удобно разрешить пользователю временно вводить недопустимое значение.

Когда вы устанавливаете это свойство в false вы не разрешаете пользователям вводить недопустимое значение (например, удаляя какой-либо символ или в этом конкретном случае, вставляя некоторый символ без цифры), и, таким образом, форматирование пытается получить самое близкое допустимое значение.

Это не неожиданное поведение, но необходимо соблюдать согласованность с контрактом, предлагаемым этим методом.

  • 0
    так есть ли обходной путь? Мне нужно setAllowsInvalid (false)
  • 0
    Обходного пути нет, потому что это не ошибка или проблема. На самом деле это довольно преимущество, что средство форматирования фактически заботится о неверном вводе. Может быть, это не делает это лучше, но рассмотрим следующие случаи: a) Пользователи-новички, вероятно, будут использовать мышь, а не клавиатуру, чтобы изменить значение счетчика. б) Опытные пользователи, вероятно, будут использовать стрелки на кейборде для обновления значений, поэтому редко им придется что-либо удалять. В обоих случаях это поведение - то, с чем пользователи могут жить. @ user2628641

Ещё вопросы

Сообщество Overcoder
Наверх
Меню