Search code examples
javacalendarjspinner

JSpinner Date Editor in Buddhist Calendar


Is there a way to use JSpinner.DateEditor with a Buddhist Calendar? When I change my locale to "th", "TH" and recreate my calendars they are indeed Buddhist Calendars. However, the JSpinners are not updated. Here is some sample code:

Locale locale = new Locale("th", "TH");
Locale.setDefault(locale);
// Reinitializing calendars with new locale, this is done correctly
encodingCalendar = Calendar.getInstance();
expirationCalendar = Calendar.getInstance();
// Modifying the spinners in another class to update them with the correct locale
// this is the part that's not doing what I'd expect.
editor.getExpirationDateSpinner().setLocale(locale);
editor.getExpirationDateSpinner().getEditor().setLocale(locale);

Any ideas?


Solution

  • Try setting the spinner's locale:

    import java.awt.EventQueue;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Locale;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerDateModel;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    public class JSpinnerTest extends JPanel {
    
        public static void main(String args[]) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame f = new JFrame("JSpinnerTest");
                    f.add(new JSpinnerTest());
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.pack();
                    f.setVisible(true);
                }
            });
        }
    
        public JSpinnerTest() {
            final JLabel label = new JLabel();
            final JSpinner spinner = new JSpinner();
            spinner.setLocale(new Locale("th", "TH"));
            Calendar calendar = Calendar.getInstance();
            Date initDate = calendar.getTime();
            calendar.add(Calendar.YEAR, -5);
            Date earliestDate = calendar.getTime();
            calendar.add(Calendar.YEAR, 10);
            Date latestDate = calendar.getTime();
            spinner.setModel(new SpinnerDateModel(
                initDate, earliestDate, latestDate, Calendar.MONTH));
            spinner.setEditor(new JSpinner.DateEditor(spinner, "MMM yyyy"));
            spinner.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    JSpinner s = (JSpinner) e.getSource();
                    label.setText(s.getValue().toString());
                }
            });
            label.setText(initDate.toString());
            this.add(label);
            this.add(spinner);
        }
    }
    

    JSpinnerTest