改写的基于SWING的日期选择控件

时间:2022-05-14 18:10:24
上次公司需要,搞了一个SWING的Aapplication的DEMO,重新弄了一般SWING,可惜最后无疾而终,可悲.....
  
  最近离职,把以前的东西整理了一下,觉得多少有点用处,写下算是悼念吧!
  
  这是其中日期选择控件的代码,改编自网上某个程序(记不得了),界面如下所示:
  
改写的基于SWING的日期选择控件

  源代码:
  
  //DatePicker.java
  
  package com.kxsoft.component;
  
  import java.awt.*;
  
  import java.awt.event.*;
  
  import java.util.GregorianCalendar;
  
  import java.util.Date;
  
  import java.util.Calendar;
  
  import java.text.DateFormat;
  
  import java.text.FieldPosition;
  
  import javax.swing.*;
  
  import javax.swing.plaf.BorderUIResource;
  
  public final class DatePicker extends JPanel {
  
  private static final long serialVersionUID = 1L;
  
  private static final int startX = 10;
  
  private static final int startY = 60;
  
  private static final Font smallFont = new Font("Dialog", Font.PLAIN, 10);
  
  private static final Font largeFont = new Font("Dialog", Font.PLAIN, 12);
  
  private static final Insets insets = new Insets(2, 2, 2, 2);
  
  private static final Color highlight = new Color(255, 255, 204);
  
  private static final Color white = new Color(255, 255, 255);
  
  private static final Color gray = new Color(204, 204, 204);
  
  private Component selectedDay = null;
  
  private GregorianCalendar selectedDate = null;
  
  private GregorianCalendar originalDate = null;
  
  private boolean hideOnSelect = true;
  
  private final JButton backButton = new JButton();
  
  private final JLabel monthAndYear = new JLabel();
  
  private final JButton forwardButton = new JButton();
  
  private final JLabel[] dayHeadings = new JLabel[]{
  new JLabel("日"),
  new JLabel("一"),
  new JLabel("二"),
  new JLabel("三"),
  new JLabel("四"),
  new JLabel("五"),
  new JLabel("六")};
  
  private final JLabel[][] daysInMonth = new JLabel[][]{
  {new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel()},
  {new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel()},
  {new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel()},
  {new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel()},
  {new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel()},
  {new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel(),
  new JLabel()}
  };
  
  private final JButton todayButton = new JButton();
  
  private final JButton cancelButton = new JButton();
  
  public DatePicker() {
  super();
  selectedDate = getToday();
  init();
  }
  
  public DatePicker(final Date initialDate) {
  super();
  if (null == initialDate)
  selectedDate = getToday();
  else
  (selectedDate = new GregorianCalendar()).setTime(initialDate);
  originalDate = new GregorianCalendar(
  selectedDate.get(Calendar.YEAR),
  selectedDate.get(Calendar.MONTH),
  selectedDate.get(Calendar.DATE));
  init();
  }
  
  public boolean isHideOnSelect() {
  return hideOnSelect;
  }
  
  public void setHideOnSelect(final boolean hideOnSelect) {
  if (this.hideOnSelect != hideOnSelect) {
  this.hideOnSelect = hideOnSelect;
  initButtons(false);
  }
  }
  
  public Date getDate() {
  if (null != selectedDate)
  return selectedDate.getTime();
  return null;
  }
  
  private void init() {
  setLayout(new AbsoluteLayout());
  this.setMinimumSize(new Dimension(161, 226));
  this.setMaximumSize(getMinimumSize());
  this.setPreferredSize(getMinimumSize());
  this.setBorder(new BorderUIResource.EtchedBorderUIResource());
  
  backButton.setFont(smallFont);
  backButton.setText("<");
  backButton.setMargin(insets);
  backButton.setDefaultCapable(false);
  backButton.addActionListener(new ActionListener() {
  public void actionPerformed(final ActionEvent evt) {
  onBackClicked(evt);
  }
  });
  add(backButton, new AbsoluteConstraints(10, 10, 20, 20));
  
  monthAndYear.setFont(largeFont);
  monthAndYear.setHorizontalAlignment(JTextField.CENTER);
  monthAndYear.setText(formatDateText(selectedDate.getTime()));
  add(monthAndYear, new AbsoluteConstraints(30, 10, 100, 20));
  
  forwardButton.setFont(smallFont);
  forwardButton.setText(">");
  forwardButton.setMargin(insets);
  forwardButton.setDefaultCapable(false);
  forwardButton.addActionListener(new ActionListener() {
  public void actionPerformed(final ActionEvent evt) {
  onForwardClicked(evt);
  }
  });
  add(forwardButton, new AbsoluteConstraints(130, 10, 20, 20));
  
  int x = startX;
  for (int ii = 0; ii < dayHeadings.length; ii++) {
  dayHeadings[ii].setOpaque(true);
  dayHeadings[ii].setBackground(Color.LIGHT_GRAY);
  dayHeadings[ii].setForeground(Color.WHITE);
  dayHeadings[ii].setHorizontalAlignment(JLabel.CENTER);
  add(dayHeadings[ii], new AbsoluteConstraints(x, 40, 21, 21));
  x += 20;
  }
  
  x = startX;
  int y = startY;
  for (int ii = 0; ii < daysInMonth.length; ii++) {
  for (int jj = 0; jj < daysInMonth[ii].length; jj++) {
  daysInMonth[ii][jj].setOpaque(true);
  daysInMonth[ii][jj].setBackground(white);
  daysInMonth[ii][jj].setFont(smallFont);
  daysInMonth[ii][jj].setHorizontalAlignment(JLabel.CENTER);
  daysInMonth[ii][jj].setText("");
  daysInMonth[ii][jj].addMouseListener(new MouseAdapter() {
  public void mouseClicked(final MouseEvent evt) {
  onDayClicked(evt);
  }
  });
  add(daysInMonth[ii][jj], new AbsoluteConstraints(x, y, 21, 21));
  x += 20;
  }
  x = startX;
  y += 20;
  }
  
  initButtons(true);
  
  calculateCalendar();
  }
  
  private void initButtons(final boolean firstTime) {
  if (firstTime) {
  final Dimension buttonSize = new Dimension(68, 24);
  todayButton.setText("今天");
  todayButton.setMargin(insets);
  todayButton.setMaximumSize(buttonSize);
  todayButton.setMinimumSize(buttonSize);
  todayButton.setPreferredSize(buttonSize);
  todayButton.setDefaultCapable(true);
  todayButton.setSelected(true);
  todayButton.addActionListener(new ActionListener() {
  public void actionPerformed(final ActionEvent evt) {
  onToday(evt);
  }
  });
  
  cancelButton.setText("取消");
  cancelButton.setMargin(insets);
  cancelButton.setMaximumSize(buttonSize);
  cancelButton.setMinimumSize(buttonSize);
  cancelButton.setPreferredSize(buttonSize);
  cancelButton.addActionListener(new ActionListener() {
  public void actionPerformed(final ActionEvent evt) {
  onCancel(evt);
  }
  });
  } else {
  this.remove(todayButton);
  this.remove(cancelButton);
  }
  
  if (hideOnSelect) {
  add(todayButton, new Absolut