调用方法
textField_2 = new JTextField();
textField_2.setBounds(299, 84, 78, 21);
contentPane.add(textField_2);
textField_2.setColumns(10);
//调用日历方法
final CalendarPanel p = new CalendarPanel(textField_2, "yyyy/MM/dd");
final JLabel lblNewLabel_3 = new JLabel();
p.initCalendarPanel();
// 定义日历控件面板类
JLabel l = new JLabel("日历面板");
p.add(l);
getContentPane().add(p);
getContentPane().add(textField_2);
setBackground(Color.WHITE);
p.hide();
lblNewLabel_3.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
p.show();
}
});
lblNewLabel_3.setIcon(new ImageIcon("C:\\Users\\JDT\\Pictures\\图标\\1086050.gif"));
lblNewLabel_3.setBounds(257, 71, 46, 46);
contentPane.add(lblNewLabel_3);
// 第一种方法
package com.mi.util;
import java.awt.Color;
public class CalendarPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JLabel btn_lastYear = null;
private JLabel btn_nextYear = null;
private JLabel btn_lastMonth = null;
private JLabel btn_nextMonth = null;
private JLabel lb_datetime = null;
private JPanel panel_maincalenderpanel = null;
private JLabel lblNewLabel = null;
private JLabel label = null;
private JLabel label_1 = null;
private JLabel label_2 = null;
private JLabel label_3 = null;
private JLabel label_4 = null;
private JLabel label_5 = null;
private JLabel btn_close = null;
private JButton btn_today = null;
private JButton btn_cancel = null;
private Object component = null; // 日历控件的载体组件,如TextField
private static String returnDateStr = null; // 保存选中的日期
private CallBack callBack = null;
private String patern = "yyyy-MM-dd"; // 日期格式
private SimpleDateFormat sdf = null;
private String nowDatetime = null; // 当前系统日期字符串
/**
*
* 带参数的构造函数,该构造函数将构造一个设置了日历控件的载体组件的CalenderPanel对象实例
*
* @param component
* 日历控件的载体组件,可以是TextField、JTextField、Label、JLabel
*
* @param patern
* 日期格式 ,默认为yyyy-MM-dd
*
*/
public CalendarPanel(Object component, String patern) {
this(patern);
this.component = component;
}
/**
*
* 带参数的构造函数,该构造函数将构造一个CalenderPanel对象实例,该对象时候没有设置日历控件的载体组件
*
* * @param patern 日期格式,默认为yyyy-MM-dd
*
*/
public CalendarPanel(String patern) {
super();
// 初始化日期格式化
this.patern = patern;
sdf = new SimpleDateFormat(patern);
nowDatetime = sdf.format(new Date());
setLayout(null);
// 设置日历控件的整体主面板边框为灰色
this.setBorder(BorderFactory.createLineBorder(Color.gray));
// 初始化日历控件上的各个组件
init();
// 创建日历控件的日期部分面板
createCalendarPanel(nowDatetime);
}
/**
*
* 无参数的构造函数,该构造函数将构造一个CalenderPanel对象实例,该对象时候没有设置日历控件的载体组件
*
*/
public CalendarPanel() {
super();
// 初始化日期格式化
sdf = new SimpleDateFormat(patern);
nowDatetime = sdf.format(new Date());
setLayout(null);
// 设置日历控件的整体主面板边框为灰色
this.setBorder(BorderFactory.createLineBorder(Color.gray));
// 初始化日历控件上的各个组件
init();
// 创建日历控件的日期部分面板
createCalendarPanel(nowDatetime);
}
/**
*
* 获取日历控件的载体组件
*
* @return 返回该日历控件中的载体组件,如果没有设置,则返回null;
*
*/
public Object getComponent() {
return component;
}
/**
*
* 设置日历控件的载体组件
*
* @param component
*
*/
public void setComponent(Object component) {
this.component = component;
}
/**
*
* 获取选择日期时候的日期字符串
*
* @return
*
*/
public String getReturnDateStr() {
return returnDateStr;
}
/**
*
* 获取日历控件的回调接口对象
*
* @return
*
*/
public CallBack getCallBack() {
return callBack;
}
/**
*
* 设置日历控件的回调接口对象
*
* @param callBack
*
*/
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
/**
*
* 创建下拉选择日历控件的主体面板(即显示日期部分的面板)
*
* @param date
* 需要显示的日期
*
*/
private void createCalendarPanel(String date) {
// 每次刷新日期显示,需要重新创建日期部分的面板
// 如果日期部分的面板不为null,可以先将其remove,然后再创建
if (panel_maincalenderpanel != null) {
panel_maincalenderpanel.setVisible(false);
this.remove(panel_maincalenderpanel);
}
// 创建新的日期部分的面板
panel_maincalenderpanel = new JPanel();
panel_maincalenderpanel.setBackground(Color.WHITE);
panel_maincalenderpanel.setBounds(2, 47, 247, 156);
panel_maincalenderpanel.setLayout(new GridLayout(6, 7));
add(panel_maincalenderpanel);
Date today = null;
try {
today = sdf.parse(date);
} catch (ParseException e1) {
e1.printStackTrace();
return;
}
Calendar c = new GregorianCalendar();
// 将给定日期设置为需要显示的日期
c.setTime(today);
// 需要将日改成1号,因为我们需要获取给定日期的第一天是星期几
c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1);
int firstDayInMonthOfWeek = c.get(Calendar.DAY_OF_WEEK); // 给定日期的第一天是星期几
int daysOfMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH); // 给定日期对应月份的天数
// 首先生成给定日期第一天之前的空白部分
// 例如:2011-11的第一天就是星期二,那么星期二之前的(星期日,星期一)我们不显示内容,需要生成空白
for (int i = 1; i < firstDayInMonthOfWeek; i++) {
JLabel bnt = new JLabel("");
bnt.setSize(27, 23);
bnt.setBackground(Color.WHITE);
panel_maincalenderpanel.add(bnt);
}
// 然后生成给定日期的日期部分,即输出1,2,3....31这样的日期
for (int i = 1; i <= daysOfMonth; i++) {
final JLabel bnt = new JLabel(String.valueOf(i));
bnt.setHorizontalAlignment(SwingConstants.CENTER);
bnt.setSize(27, 23);
bnt.setBackground(Color.WHITE);
if (Calendar.getInstance().get(Calendar.DATE) == i) {
// 将系统当期日期对应的组件的边框显示为绿色
bnt.setBorder(BorderFactory.createLineBorder(Color.GREEN));
} else {
// 其他的日期组件边框显示为白色
bnt.setBorder(BorderFactory.createLineBorder(Color.WHITE));
}
// 为定义的日期组件添加鼠标事件
bnt.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
// 当鼠标经过对应的日期上面时候,该日期对应的组件边框显示成绿色
bnt.setBorder(BorderFactory.createLineBorder(Color.GREEN));
}
@Override
public void mouseExited(MouseEvent e) {
if (Calendar.getInstanc