Copyright Derek O'Reilly, Dundalk Institute of Technology (DkIT), Dundalk, Co. Louth, Ireland.
Spinners allow users to select from a set of predefined options. Spinners contain ordered data. Spinners can be any of the following three types:
Spinner_List_Demo Example (Run Applet)
import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class Spinner_List_Demo extends JApplet { @Override public void init() { this.setContentPane(new View()); } public class View extends JPanel implements ChangeListener { private final String monthNames[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; private final SpinnerListModel monthModel = new SpinnerListModel(monthNames); private final JLabel message = new JLabel(""); public View() { super(); final JSpinner monthSpinner = new JSpinner(monthModel); this.setLayout(new BorderLayout()); this.add("North", monthSpinner); this.add("South", this.message); monthSpinner.addChangeListener(this); } @Override public void stateChanged(ChangeEvent e) { this.message.setText(String.valueOf(this.monthModel.getValue())); } } }
Spinner_Number_Demo Example (Run Applet)
import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class Spinner_Number_Demo extends JApplet { @Override public void init() { this.setContentPane(new View()); } public class View extends JPanel implements ChangeListener { private final SpinnerNumberModel numberModel = new SpinnerNumberModel(5, // initial value 1, //minimum in range 10, //maximum in range 1); //step size private final JLabel message = new JLabel(""); public View() { super(); final JSpinner numberSpinner = new JSpinner(this.numberModel); this.setLayout(new BorderLayout()); this.add("North", numberSpinner); this.add("South", this.message); numberSpinner.addChangeListener(this); } @Override public void stateChanged(ChangeEvent e) { this.message.setText(String.valueOf(this.numberModel.getValue())); } } }
The spinner's value is set to editable by default. This means that users are able to delete any part of the spinner field. This does not cause a problem for ListSpinners. However, it does cause a problem for both NumberSpinners and DateSpinners. The system it does not replace the deleted text. This can be seen in the example above.
By setting the spinner to be read-only, you can ensure that a user does not delete the spinner's value. The code to do this is:
((JSpinner.DefaultEditor) spinnerName.getEditor()).getTextField().setEditable(false);
Spinner_NumberReadOnly_Demo Example (Run Applet)
import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class Spinner_NumberReadOnly_Demo extends JApplet { @Override public void init() { this.setContentPane(new View()); } public class View extends JPanel implements ChangeListener { private SpinnerNumberModel numberModel = new SpinnerNumberModel(5, // initial value 1, //minimum in range 10, //maximum in range 1); //step size private JLabel message = new JLabel(""); public View() { super(); final JSpinner numberSpinner = new JSpinner(this.numberModel); // set the spinner to be read only ((JSpinner.DefaultEditor) numberSpinner.getEditor()).getTextField().setEditable(false); this.setLayout(new BorderLayout()); this.add("North", numberSpinner); this.add("South", this.message); numberSpinner.addChangeListener(this); } @Override public void stateChanged(ChangeEvent e) { this.message.setText(String.valueOf(this.numberModel.getValue())); } } }
DateSpinners can be formatted in various ways, as shown in the example below.
Spinner_FormattedNumber_Demo Example (Run Applet)
import java.awt.*; import java.util.Calendar; import javax.swing.*; import javax.swing.event.*; public class Spinner_FormattedNumber_Demo extends JApplet { @Override public void init() { this.setContentPane(new View()); } public class View extends JPanel implements ListSelectionListener { private final String formatNames[] = { "#", "0", "Year ####", // Any text "###,###.###", "###.##", "000000.000" }; private final JList formatList = new JList(this.formatNames); private final int thisYear = Calendar.getInstance().get(Calendar.YEAR); private final SpinnerNumberModel numberModel = new SpinnerNumberModel(this.thisYear, // initial value thisYear - 5, //minimum in range thisYear + 5, //maximum in range 1); //step size private final JSpinner numberSpinner = new JSpinner(this.numberModel); public View() { super(); this.setLayout(new BorderLayout()); this.add("North", this.formatList); this.add("South", this.numberSpinner); this.formatList.addListSelectionListener(this); } @Override public void valueChanged(ListSelectionEvent e) { this.numberSpinner.setEditor(new JSpinner.NumberEditor(this.numberSpinner, this.formatNames[this.formatList.getSelectedIndex()])); } } }
Spinner_Date_Demo Example (Run Applet)
import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; public class Spinner_Date_Demo extends JApplet { @Override public void init() { this.setContentPane(new View()); } public class View extends JPanel implements ChangeListener { private SpinnerDateModel dateModel; private JLabel message = new JLabel(""); public View() { super(); final Calendar calendar = Calendar.getInstance(); final Date today = calendar.getTime(); calendar.add(Calendar.YEAR, -5); final Date pastDate = calendar.getTime(); calendar.add(Calendar.YEAR, 10); final Date futureDate = calendar.getTime(); this.dateModel = new SpinnerDateModel(today, // initial value pastDate, //minimum in range futureDate, //maximum in range Calendar.YEAR); //step size final JSpinner dateSpinner = new JSpinner(this.dateModel); this.setLayout(new BorderLayout()); this.add("North", dateSpinner); this.add("South", this.message); dateSpinner.addChangeListener(this); } @Override public void stateChanged(ChangeEvent e) { this.message.setText(String.valueOf(this.dateModel.getValue())); } } }
DateSpinners can be formatted in various ways, as shown in the example below.
Spinner_FormattedDate_Demo Example (Run Applet)
import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; public class Spinner_FormattedDate_Demo extends JApplet { @Override public void init() { this.setContentPane(new View()); } public class View extends JPanel implements ListSelectionListener { private final String formatNames[] = { "dd.MM.yy", "dd MMMM yyyy", "yyyy.MM.dd G 'at' hh:mm:ss z", "E, MMM d, ''yy", "EEEE h:mm a", "H:mm a,z", "H:mm:ss:S", "yyyy.MMMM.dd G hh:mm a" }; private final JList formatList = new JList(this.formatNames); private JSpinner dateSpinner; private final JLabel message = new JLabel(""); public View() { super(); this.formatList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); final Calendar calendar = Calendar.getInstance(); final Date today = calendar.getTime(); calendar.add(Calendar.YEAR, -5); final Date pastDate = calendar.getTime(); calendar.add(Calendar.YEAR, 10); final Date futureDate = calendar.getTime(); final SpinnerDateModel dateModel = new SpinnerDateModel(today, // initial value pastDate, //minimum in range futureDate, //maximum in range Calendar.YEAR); //step size dateSpinner = new JSpinner(dateModel); setLayout(new BorderLayout()); add("North", this.formatList); add("South", this.dateSpinner); this.formatList.addListSelectionListener(this); } @Override public void valueChanged(ListSelectionEvent e) { this.dateSpinner.setEditor(new JSpinner.DateEditor(this.dateSpinner, this.formatNames[this.formatList.getSelectedIndex()])); } } }
Copyright Derek O' Reilly, Dundalk Institute of Technology (DkIT), Dundalk, Co. Louth, Ireland.