您的位置:首页 > 编程语言 > Java开发

java实现的一个简单日历

2013-10-07 16:01 519 查看
先贴代码,之后的文章慢慢总结分析。

首先是日历的每个格子作为一个对象,建立的一个类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();
}

}


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



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

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

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

4.很多代码从网上找的和自己写的,比如Calendar类就没用,显得比较乱,有些类的构造方法写的太长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: