После долгих поисков в источнике JRE я обнаружил, что спиннер поддерживается текстовым значением вместо истинной даты.При нажатии кнопок прокрутки вверх и вниз значение анализируется, а затем сравнивается с минимальными и максимальными значениями.Поскольку в вашем формате нет года, даты анализируются, причем год всегда равен 1970, который смещен на 0 от эпохи.Это заставляет счетчик всегда возвращать ошибку вне диапазона, когда вы пытаетесь его вращать.
Самое быстрое решение состоит в том, чтобы просто использовать 1970 как год вместо 2010. Однако, если вашПервоначальная дата - в конце 1970 года. Спиннер не позволит вашим пользователям переноситься на январь 1971 года (вместо этого он может вернуться к началу 1970 года).
Другое решение может разместить даты, которые охватывают границы календарного года.Однако, это не так просто (или довольно).В JRE, когда DateFormatter анализирует строку даты, он динамически создает экземпляр класса с использованием одного конструктора параметра String.Эта строка является датой от счетчика.По умолчанию этим классом является либо Date, либо какой-то его подкласс.У нас может быть средство форматирования для создания нашего собственного класса Date, который фиксирует год перед выполнением любого сравнения дат.
Класс даты, который добавляет год:
public static class DateThatAddsYear extends Date {
public DateThatAddsYear( String time ) {
super( time );
Calendar cal = GregorianCalendar.getInstance();
cal.setTime( this );
// Jump back to 2010, this needs to be implemented more thoroughly in order
// to support dates crossing calendar year boundaries
cal.set( Calendar.YEAR, 2010 );
setTime( cal.getTimeInMillis() );
}
}
Вручную настройте счетчик, используя наше исправление даты:
JSpinner notWorkingSpinner = new JSpinner(m2);
JSpinner.DateEditor dateEditor = new JSpinner.DateEditor(notWorkingSpinner);
DateFormatter formatter = new DateFormatter( format );
notWorkingSpinner.setEditor(dateEditor);
dateEditor.getTextField().setFormatterFactory( new DefaultFormatterFactory( formatter ) );
formatter.setValueClass( DateThatAddsYear.class ); // Tell it to use a different value class!
Ужасно, но это работает.
Также, если вы хотите ткнутьВ источнике JRE я предлагаю посмотреть на открытый метод stringToValue(String text)
InternationalFormatter (суперкласс DateFormatter).