Create a Date Slider control with JSlider in Java

Description

The following code shows how to create a Date Slider control with JSlider.

Example


/* w ww. j  a  v  a  2  s  . c o  m*/
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Hashtable;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Main extends JFrame {
  public final static Dimension RIGID_DIMENSION = new Dimension(1, 3);

  protected GregorianCalendar calendar = new GregorianCalendar();

  protected JLabel dateLabel;

  protected JSlider yearSlider = new JSlider(JSlider.HORIZONTAL, 1990, 2050, calendar.get(Calendar.YEAR));

  protected JSlider monthSlider = new JSlider(JSlider.HORIZONTAL, 1, 12, calendar
      .get(Calendar.MONTH) + 1);

  protected JSlider daySlider;

  protected Hashtable hashTable;

  protected SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, MMM d, yyyy");

  public Main() {
    super("Date Slider");
    setSize(500, 340);

    Date currentDate = new Date();
    calendar.setTime(currentDate);

    JPanel p1 = new JPanel();
    p1.setLayout(new GridLayout(4, 1));

    JPanel p = new JPanel();
    p.setBorder(new TitledBorder(new EtchedBorder(), "Selected Date"));
    dateLabel = new JLabel(dateFormat.format(currentDate) + "     ");
    dateLabel.setFont(new Font("Arial", Font.BOLD, 24));
    p.add(dateLabel);
    p1.add(p);

    yearSlider.setPaintLabels(true);
    yearSlider.setMajorTickSpacing(5);
    yearSlider.setMinorTickSpacing(1);
    yearSlider.setPaintTicks(true);
    DateListener lst = new DateListener();
    yearSlider.addChangeListener(lst);

    p = new JPanel();
    p.setBorder(new TitledBorder(new EtchedBorder(), "Year"));
    p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
    p.add(Box.createRigidArea(RIGID_DIMENSION));
    p.add(yearSlider);
    p.add(Box.createRigidArea(RIGID_DIMENSION));
    p1.add(p);

    String[] months = (new DateFormatSymbols()).getShortMonths();
    hashTable = new Hashtable(12);
    for (int i = 0; i < 12; i++)
      hashTable.put(new Integer(i + 1), new JLabel(months[i],
          JLabel.CENTER));
    monthSlider.setLabelTable(hashTable);
    monthSlider.setPaintLabels(true);
    monthSlider.setMajorTickSpacing(1);
    monthSlider.setPaintTicks(true);
    monthSlider.addChangeListener(lst);

    p = new JPanel();
    p.setBorder(new TitledBorder(new EtchedBorder(), "Month"));
    p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
    p.add(Box.createRigidArea(RIGID_DIMENSION));
    p.add(monthSlider);
    p.add(Box.createRigidArea(RIGID_DIMENSION));
    p1.add(p);

    int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    daySlider = new JSlider(JSlider.HORIZONTAL, 1, maxDays, calendar
        .get(Calendar.DAY_OF_MONTH));
    daySlider.setPaintLabels(true);
    daySlider.setMajorTickSpacing(5);
    daySlider.setMinorTickSpacing(1);
    daySlider.setPaintTicks(true);
    daySlider.addChangeListener(lst);

    p = new JPanel();
    p.setBorder(new TitledBorder(new EtchedBorder(), "Day"));
    p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
    p.add(Box.createRigidArea(RIGID_DIMENSION));
    p.add(daySlider);
    p.add(Box.createRigidArea(RIGID_DIMENSION));
    p1.add(p);

    getContentPane().add(p1, BorderLayout.CENTER);

    WindowListener wndCloser = new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    };
    addWindowListener(wndCloser);

    enableEvents(ComponentEvent.COMPONENT_RESIZED);
    setVisible(true);
  }

  protected void processComponentEvent(ComponentEvent e) {
    if (e.getID() == ComponentEvent.COMPONENT_RESIZED) {
      int w = getSize().width;

      yearSlider.setLabelTable(null);
      if (w > 200)
        yearSlider.setMajorTickSpacing(5);
      else
        yearSlider.setMajorTickSpacing(10);
      yearSlider.setPaintLabels(w > 100);

      monthSlider.setLabelTable(w > 300 ? hashTable : null);
      if (w <= 300 && w >= 200)
        monthSlider.setMajorTickSpacing(1);
      else
        monthSlider.setMajorTickSpacing(2);
      monthSlider.setPaintLabels(w > 100);

      daySlider.setLabelTable(null);
      if (w > 200)
        daySlider.setMajorTickSpacing(5);
      else
        daySlider.setMajorTickSpacing(10);
      daySlider.setPaintLabels(w > 100);
    }
  }

  public void showDate() {
    calendar.set(yearSlider.getValue(), monthSlider.getValue() - 1, 1);
    int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

    if (daySlider.getMaximum() != maxDays) {
      daySlider.setValue(Math.min(daySlider.getValue(), maxDays));
      daySlider.setMaximum(maxDays);
      daySlider.repaint();
    }

    calendar.set(yearSlider.getValue(), monthSlider.getValue() - 1, daySlider
        .getValue());
    Date date = calendar.getTime();
    dateLabel.setText(dateFormat.format(date));
  }

  class DateListener implements ChangeListener {
    public void stateChanged(ChangeEvent e) {
      showDate();
    }
  }

  public static void main(String argv[]) {
    new Main();
  }
}

The code above generates the following result.

Create a Date Slider control with JSlider in Java




















Home »
  Java Tutorial »
    Swing »




Action
Border
Color Chooser
Drag and Drop
Event
Font Chooser
JButton
JCheckBox
JComboBox
JDialog
JEditorPane
JFileChooser
JFormattedText
JFrame
JLabel
JList
JOptionPane
JPasswordField
JProgressBar
JRadioButton
JScrollBar
JScrollPane
JSeparator
JSlider
JSpinner
JSplitPane
JTabbedPane
JTable
JTextArea
JTextField
JTextPane
JToggleButton
JToolTip
JTree
Layout
Menu
Timer