且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

改写的日历小程序(Java)

更新时间:2022-09-21 16:12:36

读了博远至静博客中 Java写一个日历小程序-代码 一文,兴致顿生,饶有兴致的读了代码小日历的改进 ,自己根据此日历程序的UI设计,改写了一个日历小程序。
我使用传统的MVC结构,设计了3个类。(具体代码和工程见附件)
改写的日历小程序(Java)
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();

           }

       });

    }

}

 

改写的日历小程序(Java)

 

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



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

本文转自zhangjunhd51CTO博客,原文链接:http://blog.51cto.com/zhangjunhd/127768,如需转载请自行联系原作者