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
вы не разрешаете пользователям вводить недопустимое значение (например, удаляя какой-либо символ или, в данном конкретном случае, вставляя какой-либо нецифровый символ), и, таким образом, средство форматирования пытается получить наиболее близкое допустимое значение.
Это не неожиданное поведение, но необходимо соблюдать согласованность с контрактом, предлагаемым этим методом.