(友情提示:代码部分较多,为了便于测试,项目码源已上传至链接:http://pan.baidu.com/s/1pLscU3T 密码:ug8i)
界面:
1、类图
2、界面和相应的功能。
本次实验是在原来的CalDate日期计算类的基础上,添加了两个方法int weekDay(int m,int d,int y)与String lastDate(int m,int d,int y),此外还编写了GUInterface界面。
a、实现lastDate
1 public String lastDate(int year, int month, int day)//lastDate方法 2 { 3 String lastDate = null;//用来接收日期 4 checkLeapYear(year);//如果是闰年则将m[2]置为29 5 switch(checkInput(year,month,day))//判断输入的的合法性属于哪种类型,如果输入合法再进行相关操作 6 { 7 case 1: return lastDate = "月份超出范围"; 8 case 2: return lastDate = "日期超出范围"; 9 case 3: return lastDate = "年份超出范围"; 10 default: 11 if(month==1 && day==1)//判断是否为每年的第一天,如果 是则年份减一,为12月31日 12 { 13 year--; 14 month = 12; 15 day = 31; 16 } 17 else if(day==1 && month!=1) 18 {//如果是非1月的第一天,则为上个月的最后一天 19 month = month-1; 20 day = m[month]; 21 } 22 else //如果是其它日期 23 { 24 day--; 25 } 26 lastDate=year+"年"+month+"月"+day+"日"; 27 m[2] = 28;//重置二月的天数 28 return lastDate; 29 } 30 31 }
b、实现weekDay,利用蔡勒公式
1 //weekDay方法,根据蔡勒公式得到对应的日期,返回0表示星期日 2 public int weekDay(int year, int month, int day){ 3 if(month==1||month==2)//判断month是否为1或2 4 { 5 year--; 6 month+=12; 7 } 8 int c=year/100; 9 int y=year-c*100; 10 int week=(c/4)-2*c+(y+y/4)+(13*(month+1)/5)+day-1; 11 while(week<0){week+=7;} 12 week%=7; 13 return week; 14 }
3、整个计算日期类CalDate代码
1 public class CalDate { 2 static int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//静态数据存储月份的天数 3 4 //weekDay方法,根据蔡勒公式得到对应的日期,返回0表示星期日 5 public int weekDay(int year, int month, int day){ 6 if(month==1||month==2)//判断month是否为1或2 7 { 8 year--; 9 month+=12; 10 } 11 int c=year/100; 12 int y=year-c*100; 13 int week=(c/4)-2*c+(y+y/4)+(13*(month+1)/5)+day-1; 14 while(week<0){week+=7;} 15 week%=7; 16 return week; 17 } 18 public String lastDate(int year, int month, int day)//lastDate方法 19 { 20 String lastDate = null;//用来接收日期 21 checkLeapYear(year);//如果是闰年则将m[2]置为29 22 switch(checkInput(year,month,day))//判断输入的的合法性属于哪种类型,如果输入合法再进行相关操作 23 { 24 case 1: return lastDate = "月份超出范围"; 25 case 2: return lastDate = "日期超出范围"; 26 case 3: return lastDate = "年份超出范围"; 27 default: 28 if(month==1 && day==1)//判断是否为每年的第一天,如果 是则年份减一,为12月31日 29 { 30 year--; 31 month = 12; 32 day = 31; 33 } 34 else if(day==1 && month!=1) 35 {//如果是非1月的第一天,则为上个月的最后一天 36 month = month-1; 37 day = m[month]; 38 } 39 else //如果是其它日期 40 { 41 day--; 42 } 43 lastDate=year+"年"+month+"月"+day+"日"; 44 m[2] = 28;//重置二月的天数 45 return lastDate; 46 } 47 48 } 49 public String nextDate(int year,int month,int day)//nextDate方法 50 { 51 String newDate = null;//用来接收日期 52 checkLeapYear(year);//如果是闰年则将m[2]置为29 53 switch(checkInput(year,month,day))//判断输入的的合法性属于哪种类型,如果输入合法再进行相关操作 54 { 55 case 1: return newDate = "月份超出范围"; 56 case 2: return newDate = "日期超出范围"; 57 case 3: return newDate = "年份超出范围"; 58 default: 59 if(month==12 && day==31)//判断是否为最后一个月的最后一天,如果 是则年份加1,为1月1日 60 { 61 year++; 62 month = 1; 63 day = 1; 64 } 65 else if(day < m[month]) day++;//如果日期的天数小于本月天数执行day++;否则表示为当月的最后一天执行month++,day=1; 66 else 67 { 68 month++; 69 day =1; 70 } 71 newDate=year+"年"+month+"月"+day+"日"; 72 m[2] = 28;//重置二月的天数 73 return newDate; 74 } 75 } 76 public void checkLeapYear(int year)//如果是闰年则将m[2]置为29 77 { 78 if(year%4 == 0 && year%100 != 0) 79 m[2] = 29;//闰年2月29天 80 if(year%400 == 0) 81 m[2] = 29; 82 } 83 public int checkInput(int year,int month, int day)//判断输入是否合法,并分成不同类型 84 { 85 if(month<1 || month>12) 86 return 1; 87 if(day<1 || day>m[month]) 88 return 2; 89 if(year<1992 || year>2050) 90 return 3; 91 return 0; 92 } 93 }
4、图形界面的主要是使用CalDate类中的方法
a、ok按钮的响应事件,调用相应方法将分别将计算结果显示出来
1 okButton.addActionListener(new ActionListener() { 2 3 @Override 4 public void actionPerformed(ActionEvent e) { 5 if(e.getSource() == okButton){//判断触发源是否是ok按钮 6 //获取年月日 7 int year = Integer.parseInt( yearText.getText() ); 8 int month = Integer.parseInt( monthText.getText() ); 9 int day = Integer.parseInt( dayText.getText() ); 10 11 //调用日期计算类的weekDay方法,只有合法输入时才调用 12 if(calDate.checkInput(year, month, day) == 0) 13 { 14 String weekDay = null; 15 switch(calDate.weekDay(year, month, day)){ 16 case 0: weekDay = "日"; break; 17 case 1: weekDay = "一"; break; 18 case 2: weekDay = "二"; break; 19 case 3: weekDay = "三"; break; 20 case 4: weekDay = "四"; break; 21 case 5: weekDay = "五"; break; 22 case 6: weekDay = "六"; break; 23 } 24 weekDayText.setText(weekDay); 25 } 26 27 //调用日期计算类的lastDate方法 28 lastDayText.setText( calDate.lastDate(year, month, day) ); 29 30 //调用日期计算类的NextDate方法 31 nextDayText.setText( calDate.nextDate(year, month, day) ); 32 33 34 } 35 36 } 37 });
b、cancel按钮的响应事件,将界面的文本框清空
cancelButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { if(e.getSource() == cancelButton){//判断触发是否是cancel按钮,重置文本框 yearText.setText(""); monthText.setText(""); dayText.setText(""); weekDayText.setText(""); lastDayText.setText(""); nextDayText.setText(""); } } });
c、复写窗口关闭程序,退出时出现提示功能
1 jFrame.addWindowListener(new WindowAdapter() { 2 //复写窗口关闭程序 3 public void windowClosing(WindowEvent e){ 4 int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示", 5 JOptionPane.YES_NO_OPTION); 6 if (a == 0) { 7 System.exit(0); //关闭 8 } 9 } 10 });
5、图形界面类GUInterface完整代码
1 public class GUInterface { 2 //声明一个日期计算类对象 3 private CalDate calDate; 4 //声明一个窗体对象 5 private JFrame jFrame = new JFrame("日期计算程序"); 6 //声明按钮对象 7 private JButton okButton = new JButton("ok"); 8 private JButton cancelButton = new JButton("cancel"); 9 //声明标签 10 private JLabel yearLabel = new JLabel("年:"); 11 private JLabel monthLabel = new JLabel("月:"); 12 private JLabel dayLabel = new JLabel("日:"); 13 private JLabel weekDayLabel = new JLabel("这天是星期:"); 14 private JLabel lastDayLabel = new JLabel("上一天是:"); 15 private JLabel nextDayLabel = new JLabel("下一天是:"); 16 private JLabel infoLabel = new JLabel("请输入需要计算的年月日"); 17 18 //声明文本域 19 private JTextField yearText = new JTextField(); 20 private JTextField monthText = new JTextField(); 21 private JTextField dayText = new JTextField(); 22 private JTextField weekDayText = new JTextField(); 23 private JTextField lastDayText = new JTextField(); 24 private JTextField nextDayText = new JTextField(); 25 26 27 public GUInterface(){ 28 29 calDate = new CalDate(); 30 okButton.addActionListener(new ActionListener() { 31 32 @Override 33 public void actionPerformed(ActionEvent e) { 34 if(e.getSource() == okButton){//判断触发源是否是ok按钮 35 //获取年月日 36 int year = Integer.parseInt( yearText.getText() ); 37 int month = Integer.parseInt( monthText.getText() ); 38 int day = Integer.parseInt( dayText.getText() ); 39 40 //调用日期计算类的weekDay方法,只有合法输入时才调用 41 if(calDate.checkInput(year, month, day) == 0) 42 { 43 String weekDay = null; 44 switch(calDate.weekDay(year, month, day)){ 45 case 0: weekDay = "日"; break; 46 case 1: weekDay = "一"; break; 47 case 2: weekDay = "二"; break; 48 case 3: weekDay = "三"; break; 49 case 4: weekDay = "四"; break; 50 case 5: weekDay = "五"; break; 51 case 6: weekDay = "六"; break; 52 } 53 weekDayText.setText(weekDay); 54 } 55 56 //调用日期计算类的lastDate方法 57 lastDayText.setText( calDate.lastDate(year, month, day) ); 58 59 //调用日期计算类的NextDate方法 60 nextDayText.setText( calDate.nextDate(year, month, day) ); 61 62 63 } 64 65 } 66 }); 67 cancelButton.addActionListener(new ActionListener(){ 68 69 @Override 70 public void actionPerformed(ActionEvent e) { 71 72 if(e.getSource() == cancelButton){//判断触发是否是cancel按钮,重置文本框 73 74 yearText.setText(""); 75 monthText.setText(""); 76 dayText.setText(""); 77 weekDayText.setText(""); 78 lastDayText.setText(""); 79 nextDayText.setText(""); 80 } 81 } 82 83 }); 84 jFrame.addWindowListener(new WindowAdapter() { 85 //复写窗口关闭程序 86 public void windowClosing(WindowEvent e){ 87 int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示", 88 JOptionPane.YES_NO_OPTION); 89 if (a == 0) { 90 System.exit(0); //关闭 91 } 92 } 93 }); 94 95 jFrame.setLayout(null); 96 infoLabel.setBounds(5,5,220,30);//设置标签的位置与大小 97 yearLabel.setBounds(5,35,30,30); 98 yearText.setBounds(25,35,50,30); 99 monthLabel.setBounds(75,35,30,30); 100 monthText.setBounds(105,35,30,30); 101 dayLabel.setBounds(135,35,30,30); 102 dayText.setBounds(165,35,30,30); 103 okButton.setBounds(10,70,75,20);//设置按钮的位置与大小 104 cancelButton.setBounds(120,70,75,20); 105 weekDayLabel.setBounds(5,95,100,20); 106 weekDayText.setBounds(110,95,40,20);//设置文本框的位置与大小 107 lastDayLabel.setBounds(5, 125, 100, 20); 108 lastDayText.setBounds(110, 125, 100, 20); 109 nextDayLabel.setBounds(5, 155, 100, 20); 110 nextDayText.setBounds(110, 155, 100, 20); 111 jFrame.add(infoLabel);//向窗体加入标签、文本框、按钮 112 jFrame.add(yearLabel); 113 jFrame.add(yearText); 114 jFrame.add(monthLabel); 115 jFrame.add(monthText); 116 jFrame.add(dayLabel); 117 jFrame.add(dayText); 118 jFrame.add(okButton); 119 jFrame.add(cancelButton); 120 jFrame.add(weekDayLabel); 121 jFrame.add(weekDayText); 122 jFrame.add(lastDayLabel); 123 jFrame.add(lastDayText); 124 jFrame.add(nextDayLabel); 125 jFrame.add(nextDayText); 126 127 jFrame.setSize(300,250);//设置窗口大小 128 jFrame.setVisible(true); 129 } 130 }
6、最后运行结果