改寫的日曆小程序(Java)

讀了 博遠至靜 博客中 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_week calendar_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 塊,對應圖上中下 3 panel
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
是星期一,依次類推。
相關文章
相關標籤/搜索