java實現自定義日期選擇器的方法實例
更新時間:2017年10月16日 11:26:29 作者:蔣固金
日期選擇器是我們日常開發(fā)中經常需要用到的一個功能,下面這篇文章主要給大家介紹了關于利用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);
}
}
}
}
/**
* 添加監(jiān)聽
*/
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);
// 顯示為模態(tài)對話框
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();
}
/**
* 獲得以指定規(guī)則格式化的日期字符串
*
* @param format
* 格式化規(guī)則
* @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;
}
/**
* 標簽鼠標監(jiān)聽
*
* @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);
}
}
}
}
/**
* 按鈕動作監(jiān)聽
*
* @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();
}
}
}
/**
* 下拉選擇框項改變監(jiān)聽
*
* @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();
}
}
}
}
}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
SpringBoot Admin 如何實現Actuator端點可視化監(jiān)控
這篇文章主要介紹了SpringBoot Admin 如何實現Actuator端點可視化監(jiān)控,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Springboot中@ConfigurationProperties輕松管理應用程序的配置信息詳解
通過@ConfigurationProperties注解,可以將外部配置文件中的屬性值注入到JavaBean中,簡化了配置屬性的讀取和管理,這使得SpringBoot應用程序中配置文件的屬性值可以映射到POJO類中,實現類型安全的屬性訪問,此方法避免了手動讀取配置文件屬性的需要2024-10-10

