Search code examples
javaswingjspinner

SpinnerDateModel produces "MONTH/DAY/YEAR, HOURS:MINS AM/PM" no matter what calendarField I input


JFrame frame = new JFrame();
frame.setSize(256,256);
frame.setLayout(null);

SpinnerDateModel dateModel = new SpinnerDateModel(new Date(), null, null, Calendar.DAY_OF_MONTH);
JSpinner spinner = new JSpinner(dateModel);
spinner.setBounds(0,0, 125,45);

frame.add(spinner);
frame.setVisible(true);

whether I use Calendar.DAY_OF_MONTH or any other field I get the exact same result.

this is what I get, which I don't want. I only need "MONTH/DAY/YEAR".


Solution

  • A JSpinner has a setEditor method that edits the date field.

    Here's the complete runnable code example.

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.util.Calendar;
    import java.util.Date;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerDateModel;
    import javax.swing.SwingUtilities;
    
    public class SpinnerDateModelExample implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new SpinnerDateModelExample());
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            frame.add(createMainPanel(), BorderLayout.CENTER);
            
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
        
        private JPanel createMainPanel() {
            JPanel panel = new JPanel(new FlowLayout());
            panel.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));
            
            Date currentDate = new Date();
            SpinnerDateModel dateModel = new SpinnerDateModel(
                    currentDate, null, null, Calendar.DAY_OF_MONTH);
            JSpinner spinner = new JSpinner(dateModel);
            spinner.setEditor(new JSpinner.DateEditor(spinner, "M/d/yyyy"));
            panel.add(spinner);
            
            return panel;
        }
    
    }