博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swing 自定义日期选择器
阅读量:5883 次
发布时间:2019-06-19

本文共 11280 字,大约阅读时间需要 37 分钟。

  hot3.png

1. 如何对事件进行管理,可以查看这个

截图:

package unit;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.EventListener;import java.util.GregorianCalendar;import javax.swing.BorderFactory;import javax.swing.Box;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.SwingConstants;import javax.swing.event.EventListenerList;/** * 日期选择器 采用触发事件的方式,这样的话,就可以将DateChooser添加到任何组件之上, * 任何组件都可以捕获日期选择的事件,然后进行相应处理 *  * @author changwen * @date Aug 26, 2015 */@SuppressWarnings("all")public class DateChooser extends JPanel {	protected Color weekBackgroundColor = new Color(189, 235, 238);	protected Color weekendBtnFontColor = new Color(240, 64, 64); // color	protected Color selectedColor = weekBackgroundColor;	protected Font labelFont = new Font("Arial", Font.PLAIN, 10);	protected Color defaultBtnFontColor = Color.BLACK;	protected Color defaultBtnBackgroundColor = Color.WHITE;	private Calendar cal = null;	private Calendar todayCal = null;	private int year;	private int month;	private int day;	private JPanel controllPanel = null;	private JPanel dateContainerPanel = null;	private JLabel todayLabel = null;	protected DateButton[][] buttonDays = null;	public JComboBox monthChoice;	public JComboBox yearChoice;	protected String[] weekTitle = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };	protected int[] months = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };	private EventListenerList actionListenerList = new EventListenerList();	public DateChooser() {		buttonDays = new DateButton[6][7];		cal = Calendar.getInstance();		todayCal = Calendar.getInstance();		this.year = cal.get(Calendar.YEAR);		this.month = cal.get(Calendar.MONTH);		this.day = cal.get(Calendar.DATE);		JPanel oprPanel = createControlPanel();		this.setLayout(new BorderLayout(0, 0));		dateContainerPanel = new JPanel();		createDayPanel(cal);		setActiveDay(day);		this.add(oprPanel, BorderLayout.NORTH);		this.add(dateContainerPanel, BorderLayout.CENTER);	}	@SuppressWarnings("all")	public JPanel createControlPanel() {		controllPanel = new JPanel();		controllPanel.setBackground(Color.WHITE);		Box hBox = Box.createHorizontalBox();		String strToday = formatDate(todayCal);		todayLabel = new JLabel(strToday);		monthChoice = new JComboBox();		for (int i = 0; i < months.length; i++) {			monthChoice.addItem(months[i]);		}		monthChoice.setSelectedItem(months[month]);		monthChoice.setPreferredSize(new Dimension(monthChoice.getPreferredSize().width,				monthChoice.getPreferredSize().height));		monthChoice.addActionListener(new ActionListener() {			public void actionPerformed(ActionEvent ae) {				int i = monthChoice.getSelectedIndex();				if (i >= 0) {					month = i;					Calendar cal = new GregorianCalendar(year, month, 1);					year = cal.get(Calendar.YEAR);					month = cal.get(Calendar.MONTH);					createDayPanel(cal);				}			}		});		int currentYear = todayCal.get(Calendar.YEAR);		final int gapYears = 10;		yearChoice = new JComboBox();		for (int i = currentYear - gapYears; i < currentYear + gapYears; i++) {			yearChoice.addItem(i);		}		yearChoice.setSelectedIndex(gapYears);		yearChoice.setPreferredSize(new Dimension(yearChoice.getPreferredSize().width,				yearChoice.getPreferredSize().height));		yearChoice.addActionListener(new ActionListener() {			public void actionPerformed(ActionEvent ae) {				System.out.println(yearChoice.getSelectedIndex());				if (yearChoice.getSelectedIndex() != gapYears) {					Integer selYear = (Integer) yearChoice.getSelectedItem();					Calendar cal = new GregorianCalendar(year, month, 1);					cal.set(Calendar.YEAR, selYear);					year = cal.get(Calendar.YEAR);					month = cal.get(Calendar.MONTH);					createDayPanel(cal);				}			}		});		hBox.add(todayLabel);		hBox.add(Box.createHorizontalStrut(5));		hBox.add(monthChoice);		hBox.add(Box.createHorizontalStrut(8));		hBox.add(yearChoice);		hBox.add(Box.createHorizontalStrut(8));		controllPanel.add(hBox, BorderLayout.NORTH);		return controllPanel;	}	/**	 * 创建日期组件	 * 	 * @param cal	 *            void	 */	public void createDayPanel(Calendar cal) {		dateContainerPanel.removeAll();		dateContainerPanel.revalidate();		cal.set(Calendar.DAY_OF_MONTH, 1);		cal.add(Calendar.MONTH, 1);		cal.add(Calendar.DAY_OF_MONTH, -1);		int weeks = cal.get(Calendar.WEEK_OF_MONTH);		GridLayout grid = new GridLayout(7, 7, 0, 0);		dateContainerPanel.setLayout(grid);		cal.set(Calendar.DAY_OF_MONTH, 1);		int weekday = cal.get(Calendar.DAY_OF_WEEK);		System.out.println("weekday+" + weekday);		cal.add(Calendar.DAY_OF_MONTH, 1 - weekday);		System.out.println("Calendar.DAY_OF_MONTH=" + cal.get(Calendar.DAY_OF_MONTH));		for (int i = 0; i < 7; i++) {			JLabel weekLabel = new JLabel(weekTitle[i], SwingConstants.CENTER);			weekLabel.setFont(labelFont);			weekLabel.setOpaque(true);			weekLabel.setBackground(weekBackgroundColor);			dateContainerPanel.add(weekLabel);		}		DayButtonActionListener dayButtonActionListener = new DayButtonActionListener();		for (int i = 0; i < 6; i++) {			for (int j = 0; j < 7; j++) {				int curMonth = cal.get(Calendar.MONTH);				DateButton button = null;				if (curMonth != month) {					button = new DateButton(" ");					button.setEnabled(false);					button.setBackground(defaultBtnBackgroundColor);				} else {					int currentDay = cal.get(Calendar.DAY_OF_MONTH);					button = new DateButton(currentDay + "");					button.setHorizontalTextPosition(SwingConstants.RIGHT);					button.setFont(labelFont);					button.setBackground(defaultBtnBackgroundColor);					button.setSelectedBackground(weekBackgroundColor);					if (currentDay == todayCal.get(Calendar.DAY_OF_MONTH) && month == todayCal.get(Calendar.MONTH)							&& year == todayCal.get(Calendar.YEAR)) {						button.setBorder(BorderFactory.createLineBorder(weekendBtnFontColor));					}					if (cal.get(Calendar.MONTH) != month) {						button.setForeground(Color.BLUE);					}					if (j == 0 || j == 6) {						button.setForeground(weekendBtnFontColor);					} else {						button.setForeground(defaultBtnFontColor);					}				}				button.addActionListener(dayButtonActionListener);				buttonDays[i][j] = button;				dateContainerPanel.add(buttonDays[i][j]);				cal.add(Calendar.DAY_OF_MONTH, 1);			}		}	}	/**	 * 选中莫一天	 * 	 * @param selectedDay	 *            void	 */	public void setActiveDay(int selectedDay) {		clearAllActiveDay();		if (selectedDay <= 0) {			day = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);		} else {			day = selectedDay;		}		int leadGap = new GregorianCalendar(year, month, 1).get(Calendar.DAY_OF_WEEK) - 1;		JButton selectedButton = buttonDays[(leadGap + selectedDay - 1) / 7][(leadGap + selectedDay - 1) % 7];		selectedButton.setBackground(weekBackgroundColor);	}	/**	 * 清除所有选择的日期	 * 	 */	public void clearAllActiveDay() {		for (int i = 0; i < 6; i++) {			for (int j = 0; j < 7; j++) {				JButton button = buttonDays[i][j];				if (button.getText() != null && button.getText().trim().length() > 0) {					button.setBackground(defaultBtnBackgroundColor);					button.revalidate();				}			}		}	}	/**	 * 获取选中的日期	 * 	 * @return String	 */	public String getSelectedDate() {		Calendar cal = new GregorianCalendar(year, month, day);		return formatDate(cal);	}	private String formatDate(Calendar cal) {		String pattern = "MM-dd-yyyy";		SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);		return dateFormat.format(cal.getTime());	}	class DayButtonActionListener implements ActionListener {		public void actionPerformed(ActionEvent e) {			JButton button = (JButton) e.getSource();			if (button.getText() != null && button.getText().trim().length() > 0) {				day = Integer.parseInt(button.getText());				setActiveDay(day);				fireActionPerformed(e);// fire button click event				/**				 * 采用触发事件的方式,这样的话,就可以将DateChooser添加到任何组件之上,				 * 任何组件都可以捕获日期选择的事件,然后进行相应处理				 */			}		}	}	public void addActionListener(ActionListener actionListener) {		actionListenerList.add(ActionListener.class, actionListener);	}	public void removeActionListener(ActionListener actionListener) {		actionListenerList.remove(ActionListener.class, actionListener);	}	/**	 * 事件管理,触发事件	 * 	 * @param actionEvent	 *            void	 */	protected void fireActionPerformed(ActionEvent actionEvent) {		EventListener listenerList[] = actionListenerList.getListeners(ActionListener.class);		for (int i = 0, n = listenerList.length; i < n; i++) {			((ActionListener) listenerList[i]).actionPerformed(actionEvent);		}	}	public static void main(String[] args) {		JFrame frame = new JFrame("xxxxxx");		frame.setSize(400, 300);		final DateChooser datePicker = new DateChooser();		datePicker.addActionListener(new ActionListener() {// 事件捕获					public void actionPerformed(ActionEvent e) {						System.out.println(datePicker.getSelectedDate());					}				});		frame.getContentPane().add(datePicker);		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		frame.setLocationRelativeTo(null);		frame.setVisible(true);	}}//-------自定义按钮--------------package unit;import java.awt.Color;import java.awt.Cursor;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Paint;import java.awt.RenderingHints;import javax.swing.Action;import javax.swing.BorderFactory;import javax.swing.Icon;import javax.swing.JButton;public class DateButton extends JButton {	private static final long serialVersionUID = 1L;	protected Color normalBackground;	protected Color selectedBackground;	public DateButton() {		initAttributes();	}	public DateButton(Icon icon) {		super(icon);		initAttributes();	}	public DateButton(String text, Icon icon) {		super(text, icon);		initAttributes();	}	public DateButton(String text) {		super(text);		initAttributes();	}	public DateButton(Action a) {		super(a);		initAttributes();	}	public void initAttributes() {		setRolloverEnabled(true);		setBorder(BorderFactory.createEmptyBorder());		setContentAreaFilled(false);		setFocusPainted(false);		setNormalBackground(new Color(216, 216, 216));		setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));	}	@Override	public void paint(Graphics g) {				Graphics2D g2d = (Graphics2D) g;		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);		Paint oldPaint = g2d.getPaint();				if ((getModel().isSelected() || getModel().isPressed()) && selectedBackground != null) {			g2d.setPaint(selectedBackground);			g2d.fillRect(0, 0, getWidth(), getHeight());		} else if (getNormalBackground() != null) {			g2d.setPaint(getNormalBackground());			g2d.fillRect(0, 0, getWidth(), getHeight());		}		g2d.setPaint(oldPaint);		super.paint(g2d);	}	public void clearDefaultAttribute() {		setNormalBackground(null);	}	@Override	public void setBackground(Color bg) {		super.setBackground(bg);		normalBackground = bg;	}	public Color getNormalBackground() {		return normalBackground;	}	public void setNormalBackground(Color normalBackground) {		super.setBackground(normalBackground);		this.normalBackground = normalBackground;	}		public void setSelectedBackground(Color selectedBackground) {		this.selectedBackground = selectedBackground;	}}

转载于:https://my.oschina.net/abian/blog/497331

你可能感兴趣的文章
Vim 中使用 OmniComplete 为 C/C++ 自动补全(部分增加)
查看>>
初识Hadoop
查看>>
Oracle之内存结构(SGA、PGA)
查看>>
Binary Search Tree IN C
查看>>
jquery之trigger()
查看>>
Spring源码浅析之事务(四)
查看>>
我的友情链接
查看>>
[APM] 2个实例+5个维度解读APM技术
查看>>
Jndi配置数据源
查看>>
华为交换机端口链路类型简析——access、trunk、hybrid
查看>>
[转载] Live Writer 配置写 CSDN、BlogBus、cnBlogs、163、sina 博客
查看>>
2013年SEO集群最新优化工具
查看>>
SQL:连表查询
查看>>
MySQL日期函数、时间函数总结(MySQL 5.X)
查看>>
c语言用尾插法新建链表和输出建好的链表
查看>>
Java基础学习总结(1)——equals方法
查看>>
高性能 Oracle JDBC 编程
查看>>
java 中ResultSet可以获取的数据类型及返回值类型列表
查看>>
ubuntu 13 安装SH程序
查看>>
支付宝升级延时到账功能
查看>>