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

Поэтому я создал спиннер, используя 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

Любая помощь в этом? Спасибо

1 ответ

Решение

Исходя из названия этого вопроса и описанного поведения, происходящее объясняется в этой строке:

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

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

Согласно документу DefaultFormatter#setAllowsInvalid():

public void setAllowsInvalid(boolean allowsInvalid)

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

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

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

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