java实现自定义日期选择器的方法实例

网友投稿 393 2023-03-26


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 jcbYear;

/**

* 月份下拉选择框

*/

private JComboBox 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();

jcbMonth = new JComboBox();

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 闰年

* 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();

}

}

}

}

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:教你用Cordova打包Vue项目的方法
下一篇:打造通用的匀速运动框架(实例讲解)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~