Кажется, вы гадаете, как создавать объекты SpinnerDateModel и использовать их в JSpinner. Просто модели требуется дата начала, дата окончания и значение или дата для отображения. Например, что-то вроде этого:
// current value will be *today*
private Date value = new Date(); // today
// start will be the first of the year
private Date start = new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime();
// end will be the last of the year
private Date end = new GregorianCalendar(2019, Calendar.DECEMBER, 31).getTime();
// create date model using the above values
private SpinnerDateModel dateModel1 = new SpinnerDateModel(value, start, end, Calendar.DAY_OF_MONTH);
// put into JSpinner
private JSpinner spinner1 = new JSpinner(dateModel1);
Затем в ChangeListener вы извлекаете объект Date из Spinner, поскольку это то, что он содержит. Вы, кажется, пытаетесь извлечь строку, которая не будет работать. Например:
spinner1.addChangeListener(evt -> {
Date currentDate = (Date) spinner1.getValue(); // holds date values
String dateText = format.format(currentDate); // if we want to extract a String from it
System.out.println("Current Date: " + dateText); // display it
});
Рабочий пример может выглядеть так:
import java.awt.Dimension;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.*;
@SuppressWarnings("serial")
public class SpinnerTester extends JPanel {
// current value will be *today*
private Date value = new Date(); // today
// start will be the first of the year
private Date start = new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime();
// end will be the last of the year
private Date end = new GregorianCalendar(2019, Calendar.DECEMBER, 31).getTime();
// create date model using the above values
private SpinnerDateModel dateModel1 = new SpinnerDateModel(value, start, end, Calendar.DAY_OF_MONTH);
// put into JSpinner
private JSpinner spinner1 = new JSpinner(dateModel1);
public SpinnerTester() {
// get the format from the spinner's editor
SimpleDateFormat format = ((JSpinner.DateEditor) spinner1.getEditor()).getFormat();
// have our spinner show the date only, and not the time
format.applyPattern("MM/dd/yyyy");
// add to GUI
add(spinner1);
setPreferredSize(new Dimension(400, 200));
spinner1.addChangeListener(evt -> {
Date currentDate = (Date) spinner1.getValue(); // holds date values
String dateText = format.format(currentDate); // if we want to extract a String from it
System.out.println("Current Date: " + dateText); // display it
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
SpinnerTester mainPanel = new SpinnerTester();
JFrame frame = new JFrame("Spinner Tester");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
});
}
}
Спасибо mKorbel за ответ за показ того, как отформатировать дату, отображаемую в JSpinner.