java实现自定义日期选择器的方法实例
前言
本文主要介绍的是利用java swing写的一个日期选择器.,Swing 是一个为Java设计的GUI工具包,Swing是JAVA基础类的一部分,Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表,下面话不多说了,来一起看看详细的介绍吧。
先上效果图
代码如下:
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 = day_in_week - 1; i < 7; i++) { temp++; jlDays[1][i].setText(temp + ""); if (temp == date) { jlDays[1][i].setBackground(selectColor); } } for (int i = 2; i < 7; i++) { for (int j = 0; j < 7; j++) { temp++; if (temp > days) { return; } jlDays[i][j].setText(temp + ""); if (temp == date) { jlDays[i][j].setBackground(selectColor); } } } } /** * 添加监听 */ private void addListener() { LabelMouseListener labelMouseListener = new LabelMouseListener(); for (int i = 1; i < 7; i++) { for (int j = 0; j < 7; j++) { jlDays[i][j].addMouseListener(labelMouseListener); } } ButtonActionListener buttonActionListener = new ButtonActionListener(); jbYearPre.addActionListener(buttonActionListener); jbYearNext.addActionListener(buttonActionListener); jbMonthPre.addActionListener(buttonActionListener); jbMonthNext.addActionListener(buttonActionListener); jbChoose.addActionListener(buttonActionListener); jbToday.addActionListener(buttonActionListener); jbCancel.addActionListener(buttonActionListener); ComboBoxItemListener comboBoxItemListener = new ComboBoxItemListener(); jcbYear.addItemListener(comboBoxItemListener); jcbMonth.addItemListener(comboBoxItemListener); } /** * 解析年份或月份 * * @param yearOrMonth * 年份或月份字符串 * @return 年份或月份 */ private int parseYearOrMonth(String yearOrMonth) { return Integer.parseInt(yearOrMonth.substring(0, yearOrMonth.length() - 1)); } /** * 判断是否为闰年 * * @param year * 年份 * @return true 闰年<br/> * false 平年 */ private boolean isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } /** * 设置对话框属性 */ private void setDialogAttribute() { this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.setSize(400, 300); this.setLocationRelativeTo(null); // 显示为模态对话框 this.setModal(true); this.setTitle("日期选择器"); this.setIconImage((new ImageIcon(this.getClass().getResource("/calendar.png"))).getImage()); } /** * 刷新日期标签背景颜色 */ private void refreshLabelColor() { for (int i = 1; i < 7; i++) { for (int j = 0; j < 7; j++) { jlDays[i][j].setBackground(dateColor); } } } /** * 获得显示最小年份 * * @return 显示最小年份 */ public int getMinYear() { return minYear; } /** * 获得显示最大年份 * * @return 显示最大年份 */ public int getMaxYear() { return maxYear; } /** * 设置显示最小年份和最大年份(1900-9999) * * @param minYear * 最小年份 * @param maxYear * 最大年份 */ public void setMinAndMaxYear(int minYear, int maxYear) { if (minYear > maxYear || minYear < 1900 || maxYear > 9999) { return; } this.minYear = minYear; this.maxYear = maxYear; initYear(); } /** * 获得选中背景颜色 * * @return 选中背景颜色 */ public Color getSelectColor() { return selectColor; } /** * 设置选中背景颜色 * * @param selectColor * 选中背景颜色 */ public void setSelectColor(Color selectColor) { this.selectColor = selectColor; } /** * 获得日期背景颜色 * * @return 日期背景颜色 */ public Color getDateColor() { return dateColor; } /** * 设置日期背景颜色 * * @param dateColor * 日期背景颜色 */ public void setDateColor(Color dateColor) { this.dateColor = dateColor; } /** * 获得日期鼠标进入背景颜色 * * @return 日期鼠标进入背景颜色 */ public Color getDetaHoverColor() { return dateHoverColor; } /** * 设置日期鼠标进入背景颜色 * * @param dateHoverColor * 日期鼠标进入背景颜色 */ public void setDateHoverColor(Color dateHoverColor) { this.dateHoverColor = dateHoverColor; } /** * 获得日期标题背景颜色 * * @return 日期标题背景颜色 */ public Color getDateTitleColor() { return dateTitleColor; } /** * 设置日期标题背景颜色 * * @param dateTitleColor * 日期标题背景颜色 */ public void setDateTitleColor(Color dateTitleColor) { this.dateTitleColor = dateTitleColor; } /** * 获得日期标题字体颜色 * * @return 日期标题字体颜色 */ public Color getDateTitleFontColor() { return dateTitleFontColor; } /** * 设置日期标题字体颜色 * * @param dateTitleFontColor * 日期标题字体颜色 */ public void setDateTitleFontColor(Color dateTitleFontColor) { this.dateTitleFontColor = dateTitleFontColor; } /** * 获得日期字体颜色 * * @return 日期字体颜色 */ public Color getDateFontColor() { return dateFontColor; } /** * 设置日期字体颜色 * * @param dateFontColor * 日期字体颜色 */ public void setDateFontColor(Color dateFontColor) { this.dateFontColor = dateFontColor; } /** * 获得选择年份 * * @return 选择年份 */ public int getYear() { return year; } /** * 获得选中月份 * * @return 选中月份 */ public int getMonth() { return month; } /** * 获得选中天为当月第几天 * * @return 选中天为当月第几天 */ public int getDate() { return date; } /** * 获得选中天为一周中第几天 * * @return 选中天为一周中第几天 */ public int getDayOfWeek() { return getCalendar().get(Calendar.DAY_OF_WEEK); } /** * 获得选中天为一年中第几天 * * @return 选中天为一年中第几天 */ public int getDayOfYear() { return getCalendar().get(Calendar.DAY_OF_YEAR); } /** * 获得日期对象 * * @return 日期对象 */ public Date getDateObject() { return getCalendar().getTime(); } /** * 获得以指定规则格式化的日期字符串 * * @param format * 格式化规则 * @return 日期字符串 */ public String getDateFormat(String format) { return new SimpleDateFormat(format).format(getDateObject()); } /** * 获得Calendar对象 * * @return Calendar对象 */ private Calendar getCalendar() { Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, date); return calendar; } /** * 标签鼠标监听 * * @author jianggujin * */ final class LabelMouseListener extends MouseAdapter { @Override public void mouseClicked(MouseEvent e) { JLabel temp = (JLabel) e.getSource(); if (!temp.getText().equals("")) { int date = Integer.parseInt(temp.getText()); { if (date != JDateChooser.this.date) { JDateChooser.this.date = date; refreshLabelColor(); temp.setBackground(selectColor); } } } } @Override public void mouseEntered(MouseEvent e) { JLabel temp = (JLabel) e.getSource(); if (!temp.getText().equals("")) { temp.setBackground(dateHoverColor); } } @Override public void mouseExited(MouseEvent e) { JLabel temp = (JLabel) e.getSource(); if (!temp.getText().equals("")) { if (Integer.parseInt(temp.getText()) != date) { temp.setBackground(dateColor); } else { temp.setBackground(selectColor); } } } } /** * 按钮动作监听 * * @author jianggujin * */ final class ButtonActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getSource() == jbYearPre) { int select = jcbYear.getSelectedIndex(); if (select > 0) { jcbYear.setSelectedIndex(select - 1); } } else if (e.getSource() == jbYearNext) { int select = jcbYear.getSelectedIndex(); if (select < jcbYear.getItemCount() - 1) { jcbYear.setSelectedIndex(select + 1); } } else if (e.getSource() == jbMonthPre) { int select = jcbMonth.getSelectedIndex(); if (select > 0) { jcbMonth.setSelectedIndex(select - 1); } } else if (e.getSource() == jbMonthNext) { int select = jcbMonth.getSelectedIndex(); if (select < jcbMonth.getItemCount() - 1) { jcbMonth.setSelectedIndex(select + 1); } } else if (e.getSource() == jbChoose) { flag = true; closeDateChooser(); } else if (e.getSource() == jbToday) { flag = true; Calendar calendar = Calendar.getInstance(); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH) + 1; date = calendar.get(Calendar.DATE); closeDateChooser(); } else if (e.getSource() == jbCancel) { flag = false; closeDateChooser(); } } } /** * 下拉选择框项改变监听 * * @author jianggujin * */ final class ComboBoxItemListener implements ItemListener { public void itemStateChanged(ItemEvent e) { if (e.getSource() == jcbYear) { int year = parseYearOrMonth(jcbYear.getSelectedItem().toString()); if (year != JDateChooser.this.year) { JDateChooser.this.year = year; changeDate(); } } else if (e.getSource() == jcbMonth) { int month = parseYearOrMonth(jcbMonth.getSelectedItem().toString()); if (month != JDateChooser.this.month) { JDateChooser.this.month = month; changeDate(); } } } } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
赞 (0)