博客统计信息

51cto博客之星
用户名:zhangjunhd
文章数:128
评论数:650
访问量:1094426
无忧币:6860
博客积分:6333
博客等级:8
注册日期:2007-02-03

我的技术圈(1)

更多>>
改写的日历小程序(Java)
2009-01-24 09:42:28
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/127768
读了博远至静博客中 Java写一个日历小程序-代码 一文,兴致顿生,饶有兴致的读了代码小日历的改进 ,自己根据此日历程序的UI设计,改写了一个日历小程序。
我使用传统的MVC结构,设计了3个类。(具体代码和工程见附件)
CalendarViewer.java主要处理UI,沿用了已有代码,整理之并抽出业务逻辑,使其专注于显示层处理。
CalendarViewer.java
public class CalendarViewer extends JWindow implements ActionListener {
    JPanel calendarYmPanel = null;
    JButton leftButton = new JButton("<<");
    JButton rightButton = new JButton(">>");
    Label yearLabel = new Label();
    Label monthLabel = new Label();
    Label passedDaysLabel = new Label();
    JPanel calendarWdPanel = null;// caledar_weekcalendar_days的总包容体
    JPanel calendarWeekPanel = null;// 针对周列的布局
    JPanel calendarDaysPanel = null;// 针对日期列的布局
    JPanel calendarExitPanel = null;
    JButton quitButton = new JButton("关闭");
    Border emptyBorder = BorderFactory.createEmptyBorder();
 
    CalendarController cController = new CalendarController();
 
    public CalendarViewer() {
       super();
       buildUI();
    }
 
    public void buildUI() {
       buildTopPanel();
       buildCenterPanel();
       buildBottomPanel();
       setLayout(new BorderLayout());
       。。。。。。
    }
 
    private void buildTopPanel() {。。。。。。}
 
    private void buildCenterPanel() {。。。。。。}
 
    private void buildBottomPanel() {。。。。。。}
 
    public JPanel updateDaysPanel() {。。。。。。}
 
    public void updatePassedDaysLabel() {。。。。。。}
 
    public void actionPerformed(ActionEvent e) {。。。。。。}
 
    public static void main(String[] args) {
       SwingUtilities.invokeLater(new Runnable() {
           public void run() {
              new CalendarViewer();
           }
       });
    }
}
 
 
UI构造主要分3块,对应图上中下3panel
buildTopPanel();
buildCenterPanel();
buildBottomPanel();
事件监听的处理由下面方法完成。
actionPerformed(ActionEvent e);
基于事件的UI更新由以下两个方法完成。
updateDaysPanel();
updatePassedDaysLabel();
CalendarController.java主要处理具体的业务逻辑,而所使用的一些与具体应用无关的日历算法逻辑则交给CalendarModel.java
CalendarModel.java
public class CalendarModel {
    private int daytab[][] = {
           { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
           { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
 
    public boolean isLeapYear(int year) {
       return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
    }
 
    public int dayOfYear(int day, int month, int year) {
       int leap = isLeapYear(year) ? 1 : 0;
       for (int i = 1; i < month; i++)
           day += daytab[leap][i];
       return day;
    }
 
    public int daysOfMonth(int month, int year) {
       int leap = isLeapYear(year) ? 1 : 0;
       return daytab[leap][month];
    }
 
    public int dayOfWeek(int day, int month, int year) {
       if (month == 1) {
           month = 13;
           year--;
       }
       if (month == 2) {
           month = 14;
           year--;
       }
       return (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year
              / 100 + year / 400) % 7 + 1;
    }
}
建立一个二维数组,分别表示闰年与非闰年的每月天数。主要方法有:
boolean isLeapYear(int year);判断闰年
dayOfYear(int day, int month, int year);计算所提供日期为当前year的第几天
daysOfMonth(int month, int year);返回当前月份的天数
dayOfWeek(int day, int month, int year); 计算某年某月某日是星期几,这里使用了基姆拉尔森计算公式。
基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
d
m

y

1
2月换算为去年的13 14月计算
w=0
是星期一,依次类推。

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/127768

分享至
更多
一键收藏,随时查看,分享好友!
0人
了这篇文章

类别:Java技术圈()┆阅读()┆评论() ┆ 推送到技术圈返回首页

文章评论

 
2009-01-24 11:16:06
非常感谢您的改写,我已下载,将认真阅读您的代码,相信会给我带来莫大的帮助!
再次感谢!

2009-01-24 11:30:57
非常感谢您的改写,我已下载,将认真阅读您的代码,相信会给我带来莫大的帮助!
再次感谢!

2009-01-24 19:24:21
下载了,改写的不错

2009-02-01 16:09:45
hehe,hao dongxi

 

发表评论            

【技术门诊】专家解析:软考重点难点及应试技巧
昵  称:
登录  快速注册
验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容: