1  import javax.swing.*;
  2  import javax.swing.event.*;
  3  import java.util.*;
  4  import java.text.*;
  5  import java.awt.*;
  6  
  7  public class SpinnerModelEditorDemo extends JApplet {
  8    // Create four spinners for date, day, month, and year
  9    private JSpinner jspDate =
 10      new JSpinner(new SpinnerDateModel());
 11    private JSpinner jspDay =
 12      new JSpinner(new SpinnerNumberModel(1, 1, 31, 1));
 13    private String[] monthNames = new DateFormatSymbols().getMonths();
 14    private JSpinner jspMonth = new JSpinner
 15      (new SpinnerListModel(Arrays.asList(monthNames).subList(0, 12)));
 16    private JSpinner spinnerYear =
 17      new JSpinner(new SpinnerNumberModel(2004, 1, 3000, 1));
 18  
 19    public SpinnerModelEditorDemo() {
 20      // Group labels
 21      JPanel panel1 = new JPanel();
 22      panel1.setLayout(new GridLayout(4, 1));
 23      panel1.add(new JLabel("Date"));
 24      panel1.add(new JLabel("Day"));
 25      panel1.add(new JLabel("Month"));
 26      panel1.add(new JLabel("Year"));
 27  
 28      // Group spinners
 29      JPanel panel2 = new JPanel();
 30      panel2.setLayout(new GridLayout(4, 1));
 31      panel2.add(jspDate);
 32      panel2.add(jspDay);
 33      panel2.add(jspMonth);
 34      panel2.add(spinnerYear);
 35  
 36      // Add spinner and label to the UI
 37      add(panel1, BorderLayout.WEST);
 38      add(panel2, BorderLayout.CENTER);
 39  
 40      // Set editor for date
 41      JSpinner.DateEditor dateEditor =
 42        new JSpinner.DateEditor(jspDate, "MMM dd, yyyy");
 43      jspDate.setEditor(dateEditor);
 44  
 45      // Set editor for year
 46      JSpinner.NumberEditor yearEditor =
 47        new JSpinner.NumberEditor(spinnerYear, "####");
 48      spinnerYear.setEditor(yearEditor);
 49  
 50      // Update date to synchronize with the day, month, and year
 51      updateDate();
 52  
 53      // Register and create a listener for jspDay
 54      jspDay.addChangeListener(new ChangeListener() {
 55        @Override
 56        public void stateChanged(javax.swing.event.ChangeEvent e) {
 57          updateDate();
 58        }
 59      });
 60  
 61      // Register and create a listener for jspMonth
 62      jspMonth.addChangeListener(new ChangeListener() {
 63        @Override
 64        public void stateChanged(javax.swing.event.ChangeEvent e) {
 65          updateDate();
 66        }
 67      });
 68  
 69      // Register and create a listener for spinnerYear
 70      spinnerYear.addChangeListener(new ChangeListener() {
 71        @Override
 72        public void stateChanged(javax.swing.event.ChangeEvent e) {
 73          updateDate();
 74        }
 75      });
 76    }
 77  
 78    /** Update date spinner to synchronize with the other spinners */
 79    private void updateDate() {
 80      // Get current month and year in int
 81      int month = ((SpinnerListModel)jspMonth.getModel()).
 82          getList().indexOf(jspMonth.getValue());
 83      int year = ((Integer)spinnerYear.getValue()).intValue();
 84  
 85      // Set a new maximum number of days for the new month and year
 86      SpinnerNumberModel numberModel =
 87        (SpinnerNumberModel)jspDay.getModel();
 88      numberModel.setMaximum(new Integer(maxDaysInMonth(year, month)));
 89  
 90      // Set a new current day if it exceeds the maximum
 91      if (((Integer)(numberModel.getValue())).intValue() >
 92          maxDaysInMonth(year, month))
 93        numberModel.setValue(new Integer(maxDaysInMonth(year, month)));
 94  
 95      // Get the current day
 96      int day = ((Integer)jspDay.getValue()).intValue();
 97  
 98      // Set a new date in the date spinner
 99      jspDate.setValue(
100        new GregorianCalendar(year, month, day).getTime());
101    }
102  
103    /** Return the maximum number of days in a month. For example,
104      Feb 2004 has 29 days. */
105    private int maxDaysInMonth(int year, int month) {
106      Calendar calendar = new GregorianCalendar(year, month, 1);
107      return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
108    }
109  
110    public static void main(String[] args) {
111      javax.swing.JFrame frame = new javax.swing.JFrame(
112          "SpinnerModelEditorDemo");
113  
114      SpinnerModelEditorDemo applet = new SpinnerModelEditorDemo();
115  
116      // Add the applet instance to the frame
117      frame.getContentPane().add(applet, java.awt.BorderLayout.CENTER);
118      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
119  
120      // Invoke init and start
121      applet.init();
122      applet.start();
123  
124      // Display the frame
125      frame.pack();
126      frame.setVisible(true);
127    }
128  }