先贴代码,之后的文章慢慢总结分析。

首先是日历的每个格子作为一个对象,建立的一个类DayBox.java

import java.awt.Color;
import javax.swing.JButton;

//方格类,
public class DayBox 
{
	//属性
	int year;
	int month;//月份1-12
	int day;
	int week;//星期1-7
	JButton Labelday;
		
	//初始化
	public DayBox()
	{
		Labelday=new JButton();
		Labelday.setBackground(Color.pink);//背景颜色默认为分红
	}
	
	//设置年
	public void SetYear(int year)
	{
		this.year=year;
	}
	
	//设置月
	public void SetMonth(int month)
	{
		this.month=month;
	}
	
	//设置日
	public void SetDay(int day)
	{
		this.day=day;
	}
	
	//设置星期
	public void SetWeek(int week)
	{
		this.week=week;
	}
	
	//标签显示日期
	public void ShowDay()
	{
		Labelday.setText(this.day+"");
	}
	
	//设置颜色
	public void setColor(Color color)
	{	
		this.Labelday.setBackground(color);
	}
	
	//设置日期
	public void setText(String str)
	{
		this.Labelday.setText(str);
	}
	
}



然后是界面类Layout.java

import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;

//布局
public class Layout 
{
	//网格布局
	GridLayout gridlayout;
	
	//保存格子
	ArrayList<DayBox> daylist=new ArrayList<DayBox>();
	
	public Layout()
	{
		gridlayout=new GridLayout(6,7);
	}
	
	//构建daybox
	public ArrayList<DayBox> GetDayBoxList(int year,int month)
	{
		int count=1;//标志第几个格子
		int daycount=1;//标志日期
		boolean tag=false;//标志是否找到第一个对应的格子
		int monthday=this.getMonthDay(year, month);//本月的天数
		//找出这一年这一月的第一天是星期几
		int y,m;
		int d=1;
		y=year;
		if (month == 1) m=13;
		else if (month == 2) m=14;
		else m=month;
		int week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7 + 1;
		
		while(count<=35)
		{
			//找到
			if((week==count||tag==true)&&daycount<=monthday)
				{
					DayBox box=new DayBox();
					box.SetDay(daycount);
					box.SetMonth(month);
					box.SetWeek(week);
					box.SetYear(year);
					box.ShowDay();
					tag=true;
					daylist.add(box);
					count++;
					daycount++;
				}
			//未找到
			else{
					DayBox box=new DayBox();
					box.setColor(Color.GRAY);
					daylist.add(box);
					count++;
				}
		}
		return daylist;
	}
	
	//获得一个月有多少天
	public int getMonthDay(int year,int month)
	{
		if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
			return 31;
		else if(month==2) 
				{//判断闰年
					if((year%4==0&&year%100!=0)||(year%400==0))
						return 29;
					else return 28;
				}
		else return 30;
	}	
}



再是一个主界面构造类MainFrame.java

import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * 
 * @author lkxiaolou 
 * 主界面类
 *
 */
public class MainFram {
		
	int year,month,day;
	int y,m,d;
	JFrame mainwindow=new JFrame();	
	
	//构造方法
	public MainFram()
	{
		//获得现在时间,年月
		Date date=new Date();
		SimpleDateFormat yf=new SimpleDateFormat("yyyy");
		SimpleDateFormat mf=new SimpleDateFormat("MM");
		SimpleDateFormat df=new SimpleDateFormat("dd");
		year  = Integer.parseInt(yf.format(date));
		month = Integer.parseInt(mf.format(date));
		day   = Integer.parseInt(df.format(date));
		//复制一份
		this.y=year;
		this.m=month;
		this.d=day;
		//第一次显示界面
		this.setCalendar(year, month);
		mainwindow.setLocationRelativeTo(null);//设置居中
		//设置图标
		mainwindow.setIconImage(Toolkit.getDefaultToolkit().createImage("ico.png"));
		//添加监听
		mainwindow.addKeyListener(new KeyListen());
	}
	
	//按键适配
	class KeyListen extends KeyAdapter
	{
		@Override
		public void keyPressed(KeyEvent e) {
			switch(e.getKeyCode())
			{
				//左方向键月份减小
				case  KeyEvent.VK_LEFT:
					if(m>=2)
					{
						m--;
						setCalendar(y, m);
					}
					else 
					{
						y--;
						m=12;
						setCalendar(y, m);
					}
					break;
				//右方向键月份增加
				case KeyEvent.VK_RIGHT:
					if(m<=11)
					{
						m++;
						setCalendar(y, m);
					}
					else
					{
						y++;
						m=1;
						setCalendar(y, m);
					}
					break;
				//上方向键年增加
				case KeyEvent.VK_UP:
					y++;
					setCalendar(y, m);
					break;
				//下方向键年减少
				case KeyEvent.VK_DOWN:
					if(y>=0)
					{
						y--;
						setCalendar(y, m);
					}
					
					break;
				//空格键返回今天
				case KeyEvent.VK_SPACE:
					y=year;
					m=month;
					setCalendar(y, m);
					break;
			}
		}
	}
	
	
	//构造日历
	public void setCalendar(int year,int month)
	{
		int count;
		ArrayList<DayBox> list;
		//设置布局
		Layout layout=new Layout();
		//取消布局并清空控件
		mainwindow.setLayout(null);
		mainwindow.getContentPane().removeAll();
		//重新布局
		mainwindow.setLayout(layout.gridlayout);
		list=layout.GetDayBoxList(year, month);
		//载入布局
		mainwindow.setLayout(layout.gridlayout);
		//填入第一行
		for(count=1;count<=7;count++)
		{
			DayBox titlebox=new DayBox();
			titlebox.setColor(Color.PINK);
			if(count==1) titlebox.setText("一");
			else if(count==2) titlebox.setText("二");
			else if(count==3) titlebox.setText("三");
			else if(count==4) titlebox.setText("四");
			else if(count==5) titlebox.setText("五");
			else if(count==6) titlebox.setText("六");
			else if(count==7) titlebox.setText("日");
			mainwindow.add(titlebox.Labelday);
		}
		//填充剩余方格
		for(count=0;count<list.size();count++)
		{
			JButton btn=list.get(count).Labelday;
			//显示今天
			if(btn.getText().isEmpty()==false)
			{
				if(this.year==year&&this.month==month&&day==Integer.parseInt(btn.getText()))
					btn.setBackground(Color.RED);
			}
			mainwindow.add(btn);
		}
		//设置显示方式
		mainwindow.setSize(700, 500);
		mainwindow.setVisible(true);
		mainwindow.setResizable(false);
		mainwindow.setTitle(""+year+"年"+month+"月");
		//重新获得焦点
		mainwindow.requestFocus();
		
	}
	
}



最后是入口Calendar.java

public class Calendar {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MainFram calendar=new MainFram();
	}

}

贴个图(方向键上下换年,左右换月,空格回到当前)

java 日历农历 java实现简单的日历思路_java



总结下这个小项目不足的地方:

1.界面不好看,这个么,也没什么心思去美化,再者是功能简单,每月只显示了当月的日期,一般的日历需要显示与这个月紧接的上个月和下个月的几天,填满空格。

2.没有弄阴历和节日,也没有可以跳到任何一天的功能,主要还是界面设计比较费神。

3.代码注释写的不规范,类设置的有些不合理。

4.很多代码从网上找的和自己写的,比如Calendar类就没用,显得比较乱,有些类的构造方法写的太长。