用Java swing写的一个日期选择器.
先上效果图
代码如下:
package com.jianggujin;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
/**
* 日期选择器控件
*
* @author jianggujin
*
*/
@SuppressWarnings("serial")
public final class JDateChooser extends JDialog
{
// 定义相关参数
/**
* 年份
*/
private int year = 0;
/**
* 月份
*/
private int month = 0;
/**
* 天
*/
private int date = 0;
/**
* 日期选择背景色
*/
private Color selectColor = Color.green;
/**
* 日期背景色
*/
private Color dateColor = Color.white;
/**
* 日期鼠标进入背景色
*/
private Color dateHoverColor = Color.lightGray;
/**
* 日期标题背景色
*/
private Color dateTitleColor = Color.gray;
/**
* 日期标题字体颜色
*/
private Color dateTitleFontColor = Color.black;
/**
* 日期字体颜色
*/
private Color dateFontColor = Color.black;
/**
* 日期是否有效标志
*/
private boolean flag = false;
/**
* 最小年份
*/
private int minYear = 1900;
/**
* 最大年份
*/
private int maxYear = 2050;
// 定义所需组件
/**
* 上一年
*/
private JButton jbYearPre;
/**
* 下一年
*/
private JButton jbYearNext;
/**
* 上一月
*/
private JButton jbMonthPre;
/**
* 下一月
*/
private JButton jbMonthNext;
/**
* 年份下拉选择框
*/
private JComboBox<String> jcbYear;
/**
* 月份下拉选择框
*/
private JComboBox<String> jcbMonth;
/**
* 天标签
*/
private JLabel[][] jlDays;
/**
* 选择
*/
private JButton jbChoose;
/**
* 今日
*/
private JButton jbToday;
/**
* 取消
*/
private JButton jbCancel;
/**
* 程序主方法
*
* @param args
* 命令参数
*/
public static void main(String[] args)
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e)
{
}
JDateChooser gg = new JDateChooser();
gg.showDateChooser();
System.out.println(gg.getDateFormat("yyyy-MM-dd"));
}
/**
* 显示对话框
*/
public void showDateChooser()
{
setVisible(true);
}
/**
* 关闭对话框
*/
public void closeDateChooser()
{
this.dispose();
}
/**
* 设置时间
*
* @param year
* 年份 1900-2050
* @param month
* 月份 1-12
* @param date
* 天
*/
public void setDate(int year, int month, int date)
{
if (year >= minYear && year <= maxYear)
{
this.year = year;
}
else
{
return;
}
if (month >= 1 && month <= 12)
{
this.month = month;
}
else
{
return;
}
if (date > 0 && date <= getDaysInMonth(year, month))
{
this.date = date;
}
else
{
return;
}
}
/**
* 获得用户操作是否有效标志
*
* @return 事件是否有效
*/
public boolean getFlag()
{
return flag;
}
/**
* 构造方法
*/
public JDateChooser()
{
initComponent();
initComponentData();
addComponent();
addListener();
setDialogAttribute();
}
/**
* 实例化组件
*/
private void initComponent()
{
jbYearPre = new JButton();
jbYearNext = new JButton();
jbMonthPre = new JButton();
jbMonthNext = new JButton();
jcbYear = new JComboBox<String>();
jcbMonth = new JComboBox<String>();
jlDays = new JLabel[7][7];
jbChoose = new JButton();
jbToday = new JButton();
jbCancel = new JButton();
}
/**
* 初始化组件数据
*/
private void initComponentData()
{
jbYearPre.setText("←");
jbYearNext.setText("→");
jbMonthPre.setText("↑");
jbMonthNext.setText("↓");
Calendar calendar = Calendar.getInstance();
if (year != 0 && month != 0 && date != 0)
{
calendar.set(year, month - 1, date);
}
else
{
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
date = calendar.get(Calendar.DAY_OF_MONTH);
}
initYear();
jcbYear.setSelectedItem(year + "年");
for (int i = 1; i <= 12; i++)
{
jcbMonth.addItem(i + "月");
}
jcbMonth.setSelectedItem(month + "月");
for (int i = 0; i < 7; i++)
{
JLabel temp = new JLabel();
temp.setHorizontalAlignment(JLabel.CENTER);
temp.setVerticalAlignment(JLabel.CENTER);
temp.setOpaque(true);
temp.setBackground(dateTitleColor);
temp.setForeground(dateTitleFontColor);
jlDays[0][i] = temp;
}
for (int i = 1; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
JLabel temp = new JLabel();
temp.setHorizontalAlignment(JLabel.CENTER);
temp.setVerticalAlignment(JLabel.CENTER);
temp.setOpaque(true);
temp.setForeground(dateFontColor);
jlDays[i][j] = temp;
}
}
String[] days = { "日", "一", "二", "三", "四", "五", "六" };
for (int i = 0; i < 7; i++)
{
jlDays[0][i].setText(days[i]);
}
jbChoose.setText("选择");
jbToday.setText("今日");
jbCancel.setText("取消");
changeDate();
}
/**
* 初始化显示年份范围
*/
private void initYear()
{
jcbYear.removeAllItems();
for (int i = minYear; i <= maxYear; i++)
{
jcbYear.addItem(i + "年");
}
}
/**
* 添加组件
*/
private void addComponent()
{
// 添加背部组件
JPanel north = new JPanel();
north.add(jbYearPre);
north.add(jbMonthPre);
north.add(jcbYear);
north.add(jcbMonth);
north.add(jbMonthNext);
north.add(jbYearNext);
this.add(north, "North");
// 添加中间组件
JPanel center = new JPanel(new GridLayout(7, 7));
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
center.add(jlDays[i][j]);
}
}
this.add(center);
// 添加南部组件
JPanel jpSouth = new JPanel();
jpSouth.add(jbChoose);
jpSouth.add(jbToday);
jpSouth.add(jbCancel);
this.add(jpSouth, "South");
}
/**
* 获得指定年指定月份的天数
*
* @param year
* 年份
* @param month
* 月份
* @return 天数
*/
private int getDaysInMonth(int year, int month)
{
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if (isLeapYear(year))
{
return 29;
}
return 28;
default:
return 0;
}
}
/**
* 清空日期
*/
private void clearDate()
{
for (int i = 1; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
jlDays[i][j].setText("");
}
}
}
/**
* 更改日期
*
*/
private void changeDate()
{
refreshLabelColor();
clearDate();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
int day_in_week = calendar.get(Calendar.DAY_OF_WEEK);
int days = getDaysInMonth(year, month);
if (date > days)
{
date = 1;
}
int temp = 0;
for (int i =