Java 日历应用程序

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Date;
import java.util.StringTokenizer;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
/**
* <p>Title: Swing日历</p>
* <p>Description: 操作日期</p>
* @author duxu2004
* @version 1.0.1
*/
class JCalendar extends JPanel{
//动态表示年月日
private int year=0;
private int month=0;
private int day=0;
//主面板
private JPanel Main = new JPanel();
//日面板
private JPanel jPanelDay = new JPanel();
//月面板
private JPanel jPanelMonth = new JPanel();
//年的输入位置
private JTextField Year = new JTextField();
//月的输入位置
private JTextField Month = new JTextField();
//减少月份
private JButton MonthDown = new JButton();
//增加月份
private JButton MonthUp = new JButton();
private JPanel jPanelButton = new JPanel();
//减少年份
private JButton YearDown = new JButton();
//增加年份
private JButton YearUp = new JButton();
//显示日期的位置
private JLabel Out = new JLabel();
//中国时区,以后可以从这里扩展可以设置时区的功能
private Locale l=Locale.CHINESE;
//主日历
private GregorianCalendar cal=new GregorianCalendar(l);

//星期面板
private JPanel weekPanel=new JPanel();
//天按钮组
private JToggleButton[] days=new JToggleButton[42];
//天面板
private JPanel Days = new JPanel();
//标示
private JLabel jLabel1 = new JLabel();
private JLabel jLabel2 = new JLabel();
private JLabel jLabel3 = new JLabel();
private JLabel jLabel4 = new JLabel();
private JLabel jLabel5 = new JLabel();
private JLabel jLabel6 = new JLabel();
private JLabel jLabel7 = new JLabel();
//当前选择的天数按钮
private JToggleButton cur=null;
//月份天数数组,用来取得当月有多少天
// 1 2 3 4 5 6 7 8 9 10 11 12
private int[] mm={31,28,31,30,31,30,31,31,30,31,30,31};
//空日期构造函数
public JCalendar() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//带日期设置的构造函数
public JCalendar(int year, int month, int day) {
cal.set(year, month, day);
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
//带日历输入的构造函数
public JCalendar(GregorianCalendar calendar) {
cal=calendar;
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
//带日期输入的构造函数
public JCalendar(Date date) {
cal.setTime(date);
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
//初始化组件
private void jbInit() throws Exception {
	//初始化年、月、日
	iniCalender();
	this.setLayout(new BorderLayout());
	this.setBorder(BorderFactory.createRaisedBevelBorder());
	this.setMaximumSize(new Dimension(200, 200));
	this.setMinimumSize(new Dimension(200, 200));
	this.setPreferredSize(new Dimension(200, 200));
	Main.setLayout(new BorderLayout());
	Main.setBackground(SystemColor.info);
	Main.setBorder(null);
	Out.setBackground(Color.lightGray);
	Out.setHorizontalAlignment(SwingConstants.CENTER);
	Out.setMaximumSize(new Dimension(100, 19));
	Out.setMinimumSize(new Dimension(100, 19));
	Out.setPreferredSize(new Dimension(100, 19));
	jLabel1.setForeground(Color.red);
	jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
	jLabel1.setHorizontalTextPosition(SwingConstants.CENTER);
	jLabel1.setText("日");
	jLabel2.setForeground(Color.blue);
	jLabel2.setHorizontalAlignment(SwingConstants.CENTER);
	jLabel2.setHorizontalTextPosition(SwingConstants.CENTER);
	jLabel2.setText("六");
	jLabel3.setHorizontalAlignment(SwingConstants.CENTER);
	jLabel3.setHorizontalTextPosition(SwingConstants.CENTER);
	jLabel3.setText("五");
	jLabel4.setHorizontalAlignment(SwingConstants.CENTER);
	jLabel4.setHorizontalTextPosition(SwingConstants.CENTER);
	jLabel4.setText("四");
	jLabel5.setHorizontalAlignment(SwingConstants.CENTER);
	jLabel5.setHorizontalTextPosition(SwingConstants.CENTER);
	jLabel5.setText("三");
	jLabel6.setBorder(null);
	jLabel6.setHorizontalAlignment(SwingConstants.CENTER);
	jLabel6.setHorizontalTextPosition(SwingConstants.CENTER);
	jLabel6.setText("二");
	jLabel7.setBackground(Color.lightGray);
	jLabel7.setForeground(Color.black);
	jLabel7.setBorder(null);
	jLabel7.setHorizontalAlignment(SwingConstants.CENTER);
	jLabel7.setHorizontalTextPosition(SwingConstants.CENTER);
	jLabel7.setText("一");
	weekPanel.setBackground(UIManager.getColor("InternalFrame.activeTitleGradient"));
	weekPanel.setBorder(BorderFactory.createEtchedBorder());
	weekPanel.setLayout(new GridLayout(1,7));
	weekPanel.add(jLabel1, null);
	weekPanel.add(jLabel7, null);
	weekPanel.add(jLabel6, null);
	weekPanel.add(jLabel5, null);
	weekPanel.add(jLabel4, null);
	weekPanel.add(jLabel3, null);
	weekPanel.add(jLabel2, null);
	MonthUp.setAlignmentX((float) 0.0);
	MonthUp.setActionMap(null);
	jPanelMonth.setBackground(SystemColor.info);
	jPanelMonth.setLayout(new BorderLayout());
	jPanelMonth.setBorder(BorderFactory.createEtchedBorder());
	Month.setBorder(null);
	Month.setHorizontalAlignment(SwingConstants.CENTER);
	Month.addMouseListener(new java.awt.event.MouseAdapter() {
	public void mouseClicked(MouseEvent e) {
	Month_mouseClicked(e);
	}
	});
	Month.addKeyListener(new java.awt.event.KeyAdapter() {
	public void keyPressed(KeyEvent e) {
	Month_keyPressed(e);
	}
	});
	MonthDown.setBorder(null);
	MonthDown.setText("\u25C4");
	MonthDown.addActionListener(new java.awt.event.ActionListener() {
	public void actionPerformed(ActionEvent e) {
	MonthDown_actionPerformed(e);
	}
	});
	MonthUp.setBorder(null);
	MonthUp.setText("\u25BA");
	MonthUp.addActionListener(new java.awt.event.ActionListener() {
	public void actionPerformed(ActionEvent e) {
	MonthUp_actionPerformed(e);
	}
	});
	jPanelButton.setLayout(null);
	jPanelButton.setBorder(null);
	jPanelButton.addComponentListener(new java.awt.event.ComponentAdapter() {
	public void componentResized(java.awt.event.ComponentEvent evt) {
	jPanelButtonComponentResized(evt);
	}
	});
	Year.setBorder(BorderFactory.createEtchedBorder());
	Year.setMaximumSize(new Dimension(80, 25));
	Year.setMinimumSize(new Dimension(80, 25));
	Year.setPreferredSize(new Dimension(80, 25));
	Year.setHorizontalAlignment(SwingConstants.CENTER);
	Year.addMouseListener(new java.awt.event.MouseAdapter() {
	public void mouseClicked(MouseEvent e) {
	Year_mouseClicked(e);
	}
	});
	Year.addKeyListener(new java.awt.event.KeyAdapter() {
	public void keyPressed(KeyEvent e) {
	Year_keyPressed(e);
	}
	});
	YearDown.setBorder(null);
	YearDown.setMaximumSize(new Dimension(16, 16));
	YearDown.setMinimumSize(new Dimension(16, 16));
	YearDown.setPreferredSize(new Dimension(16, 16));
	YearDown.setSize(new Dimension(16, 16));
	YearDown.setText("▼");
	YearDown.addActionListener(new java.awt.event.ActionListener() {
	public void actionPerformed(ActionEvent e) {
	YearDown_actionPerformed(e);
	}
	});
	YearUp.setBorder(null);
	YearUp.setMaximumSize(new Dimension(16, 16));
	YearUp.setMinimumSize(new Dimension(16, 16));
	YearUp.setPreferredSize(new Dimension(16, 16));
	YearUp.setSize(new Dimension(16, 16));
	YearUp.setText("▲");
	YearUp.addActionListener(new java.awt.event.ActionListener() {
	public void actionPerformed(ActionEvent e) {
	YearUp_actionPerformed(e);
	}
	});
	jPanelDay.setLayout(new BorderLayout());
	Days.setLayout(new GridLayout(6,7));
	Days.setBackground(SystemColor.info);
	for(int i=0;i<42;i++){
	days[i]=new JToggleButton();
	days[i].setBorder(null);
	days[i].setBackground(SystemColor.info);
	days[i].setHorizontalAlignment(SwingConstants.CENTER);
	days[i].setHorizontalTextPosition(SwingConstants.CENTER);
	//days[i].setSize(l,l);
	days[i].addActionListener(new java.awt.event.ActionListener(){
	public void actionPerformed(ActionEvent e) {
	day=Integer.parseInt(((JToggleButton)e.getSource()).getText());
	showDate();
	showDays();
	}
	});
	Days.add(days[i]);
	}
	this.add(Main, BorderLayout.NORTH);
	this.add(jPanelDay, BorderLayout.CENTER);
	this.add(jPanelMonth, BorderLayout.SOUTH);
	Main.add(Year, BorderLayout.CENTER);
	Main.add(Out, BorderLayout.WEST);
	Main.add(jPanelButton, BorderLayout.EAST);
	jPanelButton.add(YearUp);
	jPanelButton.add(YearDown);
	jPanelDay.add(weekPanel,BorderLayout.NORTH);
	jPanelDay.add(Days, BorderLayout.CENTER);
	jPanelMonth.add(Month, BorderLayout.CENTER);
	jPanelMonth.add(MonthDown, BorderLayout.WEST);
	jPanelMonth.add(MonthUp, BorderLayout.EAST);
	showMonth();
	showYear();
	showDate();
	showDays();
}
//自定义重画年选择面板
void jPanelButtonComponentResized(java.awt.event.ComponentEvent evt){
YearUp.setLocation(0,0);
YearDown.setLocation(0,YearUp.getHeight());
jPanelButton.setSize(YearUp.getWidth(),YearUp.getHeight()*2);
jPanelButton.setPreferredSize(new Dimension(YearUp.getWidth(),YearUp.getHeight()*2));
jPanelButton.updateUI();
}
//测试用
public static void main(String[] args){
JFrame f=new JFrame();
f.setContentPane(new JCalendar());
f.pack();
//f.setResizable(false);
f.show();
}
//增加年份
void YearUp_actionPerformed(ActionEvent e) {
year++;
showYear();
showDate();
showDays();
}
//减少年份
void YearDown_actionPerformed(ActionEvent e) {
year--;
showYear();
showDate();
showDays();
}
//减少月份
void MonthDown_actionPerformed(ActionEvent e) {
month--;
if(month<0) {
month = 11;
year--;
showYear();
}
showMonth();
showDate();
showDays();
}
//增加月份
void MonthUp_actionPerformed(ActionEvent e) {
month++;
if(month==12) {
month=0;
year++;
showYear();
}
showMonth();
showDate();
showDays();
}
//初始化年月日
void iniCalender(){
year=cal.get(Calendar.YEAR);
month=cal.get(Calendar.MONTH);
day=cal.get(Calendar.DAY_OF_MONTH);
}
//刷新月份
void showMonth(){
Month.setText(Integer.toString(month+1)+"月");
}
//刷新年份
void showYear(){
Year.setText(Integer.toString(year)+"年");
}
//刷新日期
void showDate(){
Out.setText(Integer.toString(year)+"-"+Integer.toString(month+1)+"-"+Integer.toString(day));
}
//重画天数选择面板
void showDays() {
cal.set(year,month,1);
int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
int n=mm[month];
if(cal.isLeapYear(year)&&month==1) n++;
int i=0;
for(;i<firstDayOfWeek-1;i++){
days[i].setEnabled(false);
days[i].setSelected(false);
days[i].setText("");
}
int d=1;
for(;d<=n;d++){
days[i].setText(Integer.toString(d));
days[i].setEnabled(true);
if(d==day) days[i].setSelected(true);
else days[i].setSelected(false);;
i++;
}
for(;i<42;i++){
days[i].setEnabled(false);
days[i].setSelected(false);
days[i].setText("");
}
}
//单击年份面板选择整个年份字符串
void SelectionYear(){
Year.setSelectionStart(0);
Year.setSelectionEnd(Year.getText().length());
}
//单击月份面板选择整个月份字符串
void SelectionMonth(){
Month.setSelectionStart(0);
Month.setSelectionEnd(Month.getText().length());
}
//月份面板响应鼠标单击事件
void Month_mouseClicked(MouseEvent e) {
	//SelectionMonth();
	inputMonth();
	}
	//检验输入的月份
	void inputMonth(){
	String s;
	if(Month.getText().endsWith("月"))
	{
	s=Month.getText().substring(0,Month.getText().length()-1);
	}
	else s=Month.getText();
	month=Integer.parseInt(s)-1;
	this.showMe();
	}
	//月份面板键盘敲击事件响应
	void Month_keyPressed(KeyEvent e) {
	if(e.getKeyChar()==10)
	inputMonth();
	}
	//年份面板响应鼠标单击事件
	void Year_mouseClicked(MouseEvent e) {
	//SelectionYear();
	inputYear();
	}
	//年份键盘敲击事件响应
	void Year_keyPressed(KeyEvent e) {
	//System.out.print(new Integer(e.getKeyChar()).byteValue());
	if(e.getKeyChar()==10)
	inputYear();
	}
	//检验输入的年份字符串
	void inputYear() {
	String s;
	if(Year.getText().endsWith("年"))
	{
	s=Year.getText().substring(0,Year.getText().length()-1);
	}
	else s=Year.getText();
	year=Integer.parseInt(s);
	this.showMe();
	}
	//以字符串形式返回日期,yyyy-mm-dd
	public String getDate(){return Out.getText();}
	//以字符串形式输入日期,yyyy-mm-dd
	public void setDate(String date){
	if(date!=null){
	StringTokenizer f = new StringTokenizer(date, "-");
	if(f.hasMoreTokens())
	year = Integer.parseInt(f.nextToken());
	if(f.hasMoreTokens())
	month = Integer.parseInt(f.nextToken());
	if(f.hasMoreTokens())
	day = Integer.parseInt(f.nextToken());
	cal.set(year,month,day);
	}
	this.showMe();
	}
	//以日期对象形式输入日期
	public void setTime(Date date){
	cal.setTime(date);
	this.iniCalender();
	this.showMe();
	}
	//返回日期对象
	public Date getTime(){return cal.getTime();}
	//返回当前的日
	public int getDay() {
	return day;
	}
	//设置当前的日
	public void setDay(int day) {
	this.day = day;
	cal.set(this.year,this.month,this.day);
	this.showMe();
	}
	//设置当前的年
	public void setYear(int year) {
	this.year = year;
	cal.set(this.year,this.month,this.day);
	this.showMe();
	}
	//返回当前的年
	public int getYear() {
	return year;
	}
	//返回当前的月
	public int getMonth() {
	return month;
	}
	//设置当前的月
	public void setMonth(int month) {
	this.month = month;
	cal.set(this.year,this.month,this.day);
	this.showMe();
	}
	//刷新
	public void showMe(){
	this.showDays();
	this.showMonth();
	this.showYear();
	this.showDate();
	}
	}
	public class TestJCalendar {
		public static void main(String[] args) {
			JFrame f=new JFrame();
			f.setContentPane(new JCalendar());
			f.pack();
			//f.setResizable(false);
			f.show();
			}
			}

你可能感兴趣的:(java,Date,exception,String,null,日历)