信息与计算科学专业课程设计用Java实现日历记事本1.实验目的掌握RandomAccessFile类的使用;掌握字符输入、输出流和缓冲输入、输出流的使用。2.实验要求实验前,应事先熟悉相关知识点,拟出相应的实验操作步骤,明确实验目的和要求;实验过程中,服从实验指导教师安排,遵守实验室的各项规章制度,爱护实验仪器设备;实验操作完成后,认真书写实验报告,总结实验经验,分析实验过程中出现的问题。3.实验内容编程实现日历记事本。具体要求如下:(1)该日历可以通过在文本框中输入年份和月份设置日期,也可按年前后翻动,用鼠标左键单击“上年”和“下年”按钮,将当前日历的年份减一和加一。还可以在某年内按月前后翻动,用鼠标左键单击“上月”和“下月”按钮,将日历的月份减一和加一。(2)左键单击日历上的日期,可以通过右侧的记事本(文本区)编辑有关日志,并将日志保存到一个文件,该文件的名字是由当前日期组成的字符序列。用户可以读取、删除某个日期的日志,也可以继续向某个日志添加新的内容。在保存、删除和读取日志时都会先弹出一个确认对话框,以确认保存、删除和读取操作。(3)当某个日期有日志时,该日期以粗体16号字显示,表明这个日期有日志;当用户删除某个日期的日志后,该日期恢复原来的外观。实现效果图(参考)如下:提示:(1)组件调用publicvoidsetFont(Fontf)方法可以设置组件上的字体,Font类的构造方法为:publicFont(Stringname,intstyle,intsize),其中name是字体的名字,style决定字体的样式(如Font.BOLD表示粗体)size决定字体的大小。(具体请参考JDKAPI)(2)当左键单击日历上的日期时,如要获取该日期,可通过处理该组件上的鼠标事件来实现。4.实验步骤、实施过程、关键代码、实验结果及分析说明等1.CalendarPad类(1)进行整体布局,建立日历记事本文件,设置日历卡,把日期按星期顺序排列,并用窗口监视器实现。(2)用窗口监视器实现,结果如下:2.Notepad类(1)对日期的设置和获取,设置信息条,对文本框进行设置,保存日志、删除日志和读取日志按钮的事件实现。(2)保存日志按钮事件实现如下:(3)读取日志按钮事件实现如下:(4.)删除日志按钮事件实现如下:3Year类(1)输入年份可以实现输出,给上下年按钮设置监视器,对上下年按钮事件的实现。(2)其结果如下:4.Month类(1)设置上下月监视器,对上下月按钮的事件实现,区分闰年和平年,对天数不同的月份进行分类。(2)其结果如下:(续上页,可加页)5各个类的源代码如下:CalendarPad类://CalendarPad.javaimportjava.util.Calendar;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.util.Hashtable;publicclassCalendarPadextendsJFrameimplementsMouseListener,ActionListener{intyear,month,day;Hashtablehashtable;JButtonSave,Delete,Read;Filefile;JTextFieldshowDay[];JLabeltitle[];CalendarDate;intWeekday;NotePadnotepad=null;MonthChangeMonth;YearChangeYear;Stringweek[]={星期日,星期一,星期二,星期三,星期四,星期五,星期六};JPanelleftPanel,rightPanel;publicCalendarPad(intyear,intmonth,intday){leftPanel=newJPanel();JPanelleftCenter=newJPanel();JPanelleftNorth=newJPanel();leftCenter.setLayout(newGridLayout(7,7));rightPanel=newJPanel();this.year=year;this.month=month;this.day=day;ChangeYear=newYear(this);ChangeYear.setYear(year);ChangeMonth=newMonth(this);ChangeMonth.setMonth(month);title=newJLabel[7];showDay=newJTextField[42];for(intj=0;j7;j++){title[j]=newJLabel();title[j].setText(week[j]);title[j].setBorder(BorderFactory.createRaisedBevelBorder());title[j].setForeground(Color.blue);leftCenter.add(title[j]);}for(inti=0;i42;i++){showDay[i]=newJTextField();showDay[i].addMouseListener(this);showDay[i].setEditable(false);leftCenter.add(showDay[i]);}Save=newJButton(保存日志);Delete=newJButton(删除日志);Read=newJButton(读取日志);Read.addActionListener(this);Save.addActionListener(this);Delete.addActionListener(this);//设置监视器JPanelpSouth=newJPanel();pSouth.add(Save);pSouth.add(Delete);pSouth.add(Read);Date=Calendar.getInstance();Boxbox=Box.createHorizontalBox();box.add(ChangeYear);box.add(ChangeMonth);leftNorth.add(box);leftPanel.setLayout(newBorderLayout());add(leftNorth,BorderLayout.NORTH);leftPanel.add(leftCenter,BorderLayout.CENTER);add(pSouth,BorderLayout.SOUTH);leftPanel.validate();notepad=newNotePad(this);rightPanel.add(notepad);Containercon=getContentPane();JSplitPanesplit=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftPanel,rightPanel);con.add(split,BorderLayout.CENTER);//进行整体布局con.validate();hashtable=newHashtable();file=newFile(日历记事本.txt);if(!file.exists()){try{FileOutputStreamout=newFileOutputStream(file);ObjectOutputStreamobjectOut=newObjectOutputStream(out);objectOut.writeObject(hashtable);objectOut.close();out.close();}catch(IOExceptione){}}setCalendar(year,month);addWindowListener(newWindowAdapter(){//设置窗口监视器publicvoidwindowClosing(WindowEvente){System.exit(0);}});setVisible(true);setBounds(100,60,524,335);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==Save){notepad.Save(file,year,month,day);}elseif(e.getSource()==Delete){notepad.Delete(file,year,month,day);}elseif(e.getSource()==Read){notepad.Read(file,year,month,day);}}publicvoidsetCalendar(intyear,intmonth){//设置日历卡Date.set(year,month-1,1);Weekday=Date.get(Calendar.DAY_OF_WEEK)-1;if(month==1||month==2||month==3||month==5||month==7||month==8||month==10||month==12){Arrange(Weekday,31);}elseif(month==4||month==6||month==9||month==11){Arrange(Weekday,30);}elseif(month==2){if((year%4==0&&year%100!=0)||(year%400==0)){Arrange(Weekday,29);}else{Arrange(Weekday,28);}}}publicvoidArrange(intWeekday,intMonthday){//把日期,按星期排列for(inti=Weekday,n=1;iWeekday+Monthday;i++){showDay[i].setText(+n);if(n==day){showDay[i].setForeground(Color.blue);showDay[i].setFont(newFont(TimesRoman,Font.BOLD,20));}else{showDay[i].setFont(newFont(TimesRoman,Font.BOLD,12));showDay[i].setForeground(Color.black);}n++;}for(inti=0;iWeekday;i++){showDay[i].setText();}for(inti=Weekday+Monthday;i42;i++){showDay[i].setText();}}publicintgetYear(){returnyear;}publicvoidsetYear(inty){year=y;notepad.setYear(year);}publicintgetMonth(){returnmonth;}publicvoidsetMonth(intm){month=m;notepad.setMonth(month);}publicintgetDay(){returnday;}publicvoidsetDay(intd){day=d;notepad.setDay(day);}publicHashtablegetHashtable(){returnhashtable;}publicFilegetFile(){returnfile;}publicvoidmousePressed(MouseEvente){JTextFieldsource=(JTextField)e.getSource();try{day=Integer.parseInt(source.getText()