java实现的一个简单日历
2013-10-07 16:01
519 查看
先贴代码,之后的文章慢慢总结分析。
首先是日历的每个格子作为一个对象,建立的一个类DayBox.java
然后是界面类Layout.java
再是一个主界面构造类MainFrame.java
最后是入口Calendar.java
贴个图(方向键上下换年,左右换月,空格回到当前)
![](http://img.blog.csdn.net/20131007155505390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGt4aWFvbG91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
总结下这个小项目不足的地方:
1.界面不好看,这个么,也没什么心思去美化,再者是功能简单,每月只显示了当月的日期,一般的日历需要显示与这个月紧接的上个月和下个月的几天,填满空格。
2.没有弄阴历和节日,也没有可以跳到任何一天的功能,主要还是界面设计比较费神。
3.代码注释写的不规范,类设置的有些不合理。
4.很多代码从网上找的和自己写的,比如Calendar类就没用,显得比较乱,有些类的构造方法写的太长。
首先是日历的每个格子作为一个对象,建立的一个类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类就没用,显得比较乱,有些类的构造方法写的太长。
相关文章推荐
- struts2环境配置
- 【Java工程师之路】[1-3.2]java jar工具
- Eclipse 高亮显示选中的相同变量
- 【Java工程师之路】[1-3.1]java注解
- 【Struts2配置文件的配置】
- 【struts标签+jstl标签之国际化实例】
- 【Struts轻松搞定多文件上传】
- Java写贪吃蛇游戏,用双缓冲重写update方法解决了闪烁问题,有出现了这个问题……
- Java桌面应用
- Spring的IOC原理[通俗解释一下]
- MyEclipse 10修改Servlet.java模块
- struts2拦截器的实现原理及源码剖析
- spring-dependencies依赖项目jar下载地址
- java提高篇-----理解java的三大特性之继承
- spring_webservice_Hessian和Burlap配置示例
- 在eclipse中,怎么改变字体大小?
- spring_webservice_rmi配置示例
- java序列化
- JavaIO中的Reader和writer
- java.io.stream