Поэтому я создал 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
Любая помощь по этому поводу? благодаря
Основываясь на названии этого вопроса и описываемого поведения, то, что происходит, объясняется в этой строке:
DateFormatter formatter = (DateFormatter) ftf.getFormatter();
formatter.setAllowsInvalid(false); // here is the key
Согласно стандарту DefaultFormatter # setAllowsInvalid() docs:
public void setAllowsInvalid(boolean allowsInvalid)
Устанавливает, разрешено ли редактируемое значение недействительным в течение определенного периода времени (то есть
stringToValue
ParseException
). Часто бывает удобно разрешить пользователю временно вводить недопустимое значение.
Когда вы устанавливаете это свойство в false
вы не разрешаете пользователям вводить недопустимое значение (например, удаляя какой-либо символ или в этом конкретном случае, вставляя некоторый символ без цифры), и, таким образом, форматирование пытается получить самое близкое допустимое значение.
Это не неожиданное поведение, но необходимо соблюдать согласованность с контрактом, предлагаемым этим методом.