java Swing 日历组件

本文详细介绍了如何利用Java Swing库构建一个功能齐全的日历组件。内容包括Swing组件的基本使用,事件监听,以及如何自定义日历的显示和交互功能。通过实例代码展示,读者将能够学会创建一个用户友好的桌面应用日历。
摘要由CSDN通过智能技术生成
调用方法
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值