java swing 日历控件怎么实现 最好是源码

java 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);


  }




不知道你是否听说过swingx?它是swinglabs的项目,虽然现在已不再继续,但弊肆它提供了非常多好用的Swing扩展组件。其中包括JXDatepicker(日期输入控件),JXMonthView(月视图日历控件)。

swingx你可以到maven库里面搜索Jar包(google "maven repos",出现很多maven库,随便找一个,搜索swingx,找最新的下载。如果你使用maven管理项目,那更好办了,把swingx放入依赖里面即可)。

JXDatepicker的使用方法:
// JXDatePicker提供了编辑器供用户直接输入日期,也提供了右侧按钮,点击按钮出现日期选择期供用户选岁卜搏择日期。
JXDatePicker datePicker = new JXDatePicker();
JXDatePicker datePicker1 = new JXDatePicker(new java.util.Date());
java.util.Date date = datePicker.getDate(); // 用户输入或选择日期后得到日期值
java.util.Date date1 = datePicker1.getDate(); // 用户输入或选择日期后得到日期值
//当然,你也可以指定用户输入日期的格式。
JXDatePicker datePicker2 = new JXDatePicker();
datePicker2.setFormats("yyyy.M.d", "yyyy-M-d");//可同时设置多种格式。setFormats(String...format)

JXMonthView的使用方法:
JXMonthView monthView = new JXMonthView();
monthView.setUnselectableDates(new java.util.Date());// 设置多个不可选择的日期,setUnselectableDates(java.util.Date ... date)
Set unselectable = monthView.getSelectionModel().getUnselectableDates();//乎祥 获得当前有哪些不可选择日期
monthView.setFlaggedDates(date1,date2)// 设置多个被标记了的日期
Set flaggedDates = monthView.getFlaggedDates();// 获得被标记的日期
Calendar calendar = monthView.getCalendar();// 获得日历对象
还有一些可set,get的属性罗列如下:
selectionMode
traversable
firstDayOfWeek
还有更多用法,看API吧。如果使用Maven,你可以自动下载javadoc和javasource。
有并辩腊开源的灶山,绝滑

http://sourceforge.net/projects/datepicker/
发到邮箱了

嗯。 。 开源组件 有这个伏橘慧 比如 openSwing 这伍虚个开源组件包里缺答就有这种控件。 以前我没事也写了一个这样的东东。
← 上一篇: 下一篇: →