2022年面向对象程序设计说明书及程序 .pdf
1 楷日历记事本1.课程设计目的通过此次课程设计,巩固所学Java 语言基本知识,增进Java 语言编辑基本功,掌握JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用。使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java 语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。本课程设计设计GUI 界面的日历记事本,系统将日历和记事本结合在一起,可以方便的保存、查看日志,即在任何日期记载下有关内容或查看某个日期记载的内容。2.设计方案论证2.1 设计思路2.1.1 本系统界面的左侧是日历和一幅图像。该日历可以按年前后翻动,用鼠标左键单击“上年”按钮,可将当前日历的年份减一;用鼠标左键单击“下年”按钮,可将当前日历的年份加一。该日历还可以在某年内按月前后翻动,用鼠标单击“上月”按钮,可将当前日历的月份减一;用鼠标单击“下月”按钮,可将当前日历的月份增一。2.1.2 系统界面的右侧是记事本和一个时钟。用鼠标单击日历上的日期,就可以通过该记事本编辑有关日志,并将日志保存到一个文件。该文件的名字是由当前日期组成的字符序列。用户可以查看、删除某个日期的日志,也可以继续向某个日志添加新的内容。2.1.3 当某个日期有日志时,显示该日期的外观上就会出现“有”标记,表明这个日期有日志;当用户删除某个日期的日志后,该日期的外观上的“有”标记就会消失。2.2 设计方法在 设 计 日 历 记 事 本 时,需 要 编 写6 个Java源 文 件:CalendarWindow.java、CalendarPad.java、NotePad.java、CalendarImage.java、Clock.java和CalendarMessage.java。日历记事本除了需要编写的上述6 个 Java 源文件所给出的类外,还需要Java 系统提供的一些重要的类,如JTextField、JTextArea 和 File类。2.2.1 CalendarWindow.java 主类名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 29 页 -2 楷该类创建动态日历记事本的主窗口,该类含有main 方法,是程序的入口程序,CalenderWindow 类的成员变量中有5 种重要类型的对象,CalendarPad、NotePad、CalendarImage、Clock、CalendarMessage 对象。2.2.2 CalenderMessage.java 该类用来刻画和“日期”有关的数据。2.2.3 CalenderPad.java 该类是 JPanel 类的子类,所创建的对象是CalendarWindow 类的重要成员之一,用来表示”日历”,即负责显示和修改CalendarMessage 对象中的日期数据。2.2.4 Notepad.java 该类是 JPanel 的一个子类,创建的对象表示“记事本”,提供编辑读取和保存阐述日志的功能。2.2.5 CalendarImage.java 该类所创建的对象是CalendarWindow 类的成员之一,负责绘制图像。2.2.6 Clock.java 该类创建的对象是CalendarWindow 类的成员之一,负责显示时钟。日历记事本用到的一些重要的类以及之间的关系如图1 所示。图 1 类之间的组合关系图2.3 功能模块此设计共有以下几个功能模块。2.3.1 年份改变CalendarWindowCalendarImageClockFileNotepadCalenderMessageCalenderPadJTextFieldJTextAre名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 29 页 -3 楷点击一次“上年”按钮可增加一年,点击一次“下年”按钮可减少一年,多次连续点击即可依次改变多个年份。2.3.2 月份改变点击一次“上月”按钮可以增加一月,点击一次“下年”按钮可以减少一月,多次连续点击即可一次改变多个月份。2.3.3 日期显示用于显示当前所选择的所在的年份月份的所有日期、星期,并在记载有日志的日期格中左上角显示“有”标记,而没有记载日志的日期则没有任何标记。2.3.4 图片显示为了使本设计界面美观,设置了图片显示模块,使整个设计更加实用、美观、大方。2.3.5 日志显示界面的右侧上半部的文本框中,可以选择某天记载日志,并且读取的日志在此部分显示出来。2.3.6 时钟显示以传统时钟(有时针、分针、秒针)的模式显示当前的时间。2.3.7 保存、删除、读取日志。可以在没有记载日志的日期里记载日志并保存,可以对以保存的日志进行读取、修改或者删除。2.4 流程图如下名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 29 页 -4 楷图 2 流程图2.5 类、方法、属性说明2.5.1 CalendarWindow类(1)成员变量year,month 和 day 是 int型数据,它们的值分别确定年份、月份和日期。calendarMessage是 CalendarMessage 对象,该对象可以处理和日期有关的数据。calendarPad是 CalendarPad 对象,该对象可以显示和日期有关的数据。notePad 是 NotePad 对象,具有编辑、读取、保存和删除日志的功能。showYear 和 showMonth 是 JTextField类创建的文本框,用来显示年份和月份。showDay数组的每个单元是JTextField类创建的用来显示日期的文本框。calendarImage是 CalendarImage 创建的对象,用来显示图像。显示窗口界面保存日志删除日志读取日志保存并标记“有”显示日志选择日期删除并去掉“有”否是是是否否结束程序开始名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 29 页 -5 楷clock是 Clock 创建的对象,用来显示时钟。nextYear 等是 JButton创建的按钮对象,名字依次为“下年”、“上年”、“下月”、“上月”。这些按钮都将当前窗口注册为自己的ActionEvent事件监听者。saveDauktRecord,deleteDailyRecord,readDailyRecord是 JButton创建的按钮对象,名字依次为“保存日志”、“删除日志”、“读取日志”。这些按钮都当前窗口注册为自己的 ActionEvent事件监听者。(2)方法CalendarWindow()是构造方法,负责完成窗口的初始化。actionPerformed(AcrionEvent)方法是 CalendarWindow 类实现的ActionListner 接口中的方法。mousePressed(MouseEvent)方法是 CalendarWindow 类实现的MouseListener接口中的方法。doMark()方法负责对有日志的日期作出标记。main 方法是程序运行的人口方法。2.5.2 CalenderMessage类(1)成员变量year、month 和 day 是 int型数据,它们的值分别确定年份、月份和日期。(2)方法setYear(int)和 getYear()方法分别用来设置year 和获取 year 的值。setMonth(int)和 getMonth()方法分别用来设置month 和获取 month 的值。setDay(int)和 getDay()方法分别用来设置day 和获取 day 的值。25.3 CalenderPad类(1)成员变量year、month 和 day 是 int型数据,它们的值分别确定年份、月份和日期。calenderMessage是 CalenderMessage 对象,该对象可以处理和日期有关的数据。showDay数组的每个单元是JTextField类创建的用来显示日期的文本框。(2)方法CalenderPad()是构造方法,用来创建calenderPad对象。setShowDayTextField(JTextField)方法负责设置showDay数组。showMonthCalendar()方法负责显示“日历”。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 29 页 -6 楷2.5.4 Notepad类(1)成员变量text是 JTextArea 创建的文本区,可在text中编辑多行文本。menu是 JpopupMenu创建的弹出式菜单。showMessage是 JTextField创建的文本条,用来显示和日期有关的数据。(2)方法Notepad()是构造方法,用来创建notePad 对象。setShowMessage(int,int,int)方法根据参数指定的日期数据显示有关日期信息。save(File,int,int,int)方法根据参数指定的日期保存日志。delete(File,int,int,int)方法删除参数日期指定的日志。2.5.5 CalendarImage类(1)成员变量imageFile是 File对象,用来存放图像文件的引用。image 是 Image 对象。tool是 Toolkit对象,负责创建image 对象。(2)方法CalendarImage()是构造方法,负责创建calendarImage对象。paintComponent(Graphics)方法负责绘制image。2.5.6 Clock类(1)成员变量date 是 Date 对象,负责封装本地时间。secondTime 是 javax.swing包中 Timer 类中创建的计时器。pointSX,pointSY 是 double 型数组,其单元值用来表示秒针端点坐标。(2)方法Clock()是构造方法,用来创建clock对象。paintComonent(Graphics)负责完成绘制工作。3.设计结果与分析将 6 个 Java 源文件:CalendarWindow.java、CalendarPad.java、NotePad.java、CalendarImage.java、Clock.java和CalendarMessage.java,以 及 所 需 要 的 名 为flower.jpg的图像文件保存到同一目录中。分别编译这6 个 Java 源文件,或运行“javac 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 29 页 -7 楷*.java”命令,编译全部的源文件,然后运行主类,即运行CalendarWindow 类。运行结果图中可以看出记载日志的日期中会有“有”标记,而没有记载日志的日期中没有“有”标记。右下侧是时钟,左下角显示图片。图 3 运行结果图在此结果中,点击上方的“上年”或“下年”可以改变年份,点击“上月”或“下月”可以改变月份。右下角显示当前的时间。可以在任意一天记日志,在有“有”标记的日期查看日志或删除日志。当想保存日志时,选中某一天,在右侧记下日志点击“保存”即可。当想查看某天的日志是选中带“有”标记的当天,点击“读取日志”可出现图4 所示的提示框,点击是即可读取日志就可以查看日志内容,如图5 所示。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 29 页 -8 楷图 4 提示显示页面图图 5 查看日志图若想要删除已有的日志,则选中要删除的日期,点击“删除日志”,则出现提示框,名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 29 页 -9 楷如图 6 所示,询问是否要删除,点击“是”,则删除了此篇日志,此时,原有的“有”字标记就会消失,此篇日志也就随之消失,如图7 所示。图 6 提示删除页面图图 7 删除后页面图当想要更改日志中文字的格式和大小。点击字体大小的下拉链条,选择想要的字体,如图 8 所示。如果想设置字体的格式,这点击格式的下拉链条,如图9 所示。名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 29 页 -10 楷图 8 选择字体大小图 9 选择字体格式如果想要更改图片,则单击左上角设置按钮,选择【选择图像】按钮,选择想要设置的图片,如图10、11 所示名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 29 页 -11 楷图 10 选择选择图像图 10 选择选择图像后4.设计体会经过几天的努力,参考了一些书和网上的资料,完成了一个日历记事本的设计。由于只学过一学期的Java 课程,知识掌握的有限,所以此程序不是特别复杂。在这个名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 29 页 -12 楷过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA 语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。本次课程设计不仅巩固了以前所学的知识,还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。所以网络这个强大的工具,确实是我们学习之中可以借助的一个很好的帮手。网络是我们学习的最好的老师之一。有问题,问网络,是一个很好的习惯。因此学到了不少书本上没有的知识;学到了很多java 编程知识。可以说它给了我一次自我评估的机会。通过设计让我知道了那些方面我还是有欠缺的,促使我花时间弥补。总之,本次课程设计收获颇丰。5.参考文献1 耿详义,张跃平Java2 程序设计(第二版)北京:清华大学出版社;2008.11 2 董小园 Java 面向对象程序设计北京:清华大学出版社;2011.6 附件:import javax.swing.*;import java.io.*;import java.awt.*;public class CalendarImage extends JPanel File imageFile;Image image;Toolkit tool;CalendarImage()tool=getToolkit();public void setImageFile(File f)imageFile=f;try image=tool.getImage(imageFile.toURI().toURL();catch(Exception exp)repaint();public void paintComponent(Graphics g)名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 29 页 -13 楷 super.paintComponent(g);int w=getBounds().width;int h=getBounds().height;g.drawImage(image,0,0,w,h,this);、import java.util.Calendar;public class CalendarMessage int year=-1,month=-1,day=-1;public void setYear(int year)this.year=year;public int getYear()return year;public void setMonth(int month)if(month=1)this.month=month;else this.month=1;public int getMonth()return month;public void setDay(int day)this.day=day;public int getDay()return day;public String getMonthCalendar()String day=new String42;Calendar rili=Calendar.getInstance();rili.set(year,month-1,1);/将日历翻到 year 年 month月 1 日,注意 0表示一月.11表示十二月 int 星期几=rili.get(Calendar.DAY_OF_WEEK)-1;int dayAmount=0;if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)dayAmount=31;if(month=4|month=6|month=9|month=11)dayAmount=30;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 29 页 -14 楷 if(month=2)if(year%4=0)&(year%100!=0)|(year%400=0)dayAmount=29;else dayAmount=28;for(int i=0;i星期几;i+)dayi=;for(int i=星期几,n=1;i 星期几+dayAmount;i+)dayi=String.valueOf(n);n+;for(int i=星期几+dayAmount;i42;i+)dayi=;return day;、import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;public class CalendarPad extends JPanel int year,month,day;CalendarMessage calendarMessage;JTextField showDay;JLabel title;String 星期=SUN日,MON一,TUE 二,WED三,THU 四,FRI五,SAT 六;JPanel north,center;public CalendarPad()setLayout(new BorderLayout();north=new JPanel();north.setLayout(new GridLayout(1,7);center=new JPanel();center.setLayout(new GridLayout(6,7);add(center,BorderLayout.CENTER);add(north,BorderLayout.NORTH);title=new JLabel7;for(int j=0;j7;j+)titlej=new JLabel();titlej.setFont(new Font(TimesRoman,Font.BOLD,12);titlej.setText(星期j);titlej.setHorizontalAlignment(JLabel.CENTER);titlej.setBorder(BorderFactory.createRaisedBevelBorder();名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 29 页 -15 楷 north.add(titlej);title0.setForeground(Color.red);title6.setForeground(Color.blue);public void setShowDayTextField(JTextField text)showDay=text;for(int i=0;ishowDay.length;i+)showDayi.setFont(new Font(TimesRoman,Font.BOLD,15);showDayi.setHorizontalAlignment(JTextField.CENTER);showDayi.setEditable(false);center.add(showDayi);public void setCalendarMessage(CalendarMessage calendarMessage)this.calendarMessage=calendarMessage;public void showMonthCalendar()String a=calendarMessage.getMonthCalendar();for(int i=0;i42;i+)showDayi.setText(ai);validate();、import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;import java.io.*;public class CalendarWindow extends JFrame implements ActionListener,MouseListener,FocusListener JMenuBar menu;JMenu sz;JMenuItem xtx;int year,month,day;CalendarMessage calendarMessage;CalendarPad calendarPad;NotePad notePad;JTextField showYear,showMonth;JTextField showDay;CalendarImage calendarImage;Clock clock;名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 29 页 -16 楷 JButton nextYear,previousYear,nextMonth,previousMonth;JButton button0,saveDailyRecord,deleteDailyRecord,readDailyRecord;File dir;Color backColor=Color.white;public CalendarWindow()dir=new File(./dailyRecord);dir.mkdir();showDay=new JTextField42;for(int i=0;i12)month=1;showMonth.setText(+month);calendarMessage.setMonth(month);calendarPad.setCalendarMessage(calendarMessage);calendarPad.showMonthCalendar();notePad.setShowMessage(year,month,day);doMark();else if(e.getSource()=previousMonth)month-;名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 29 页 -19 楷 if(month1)month=12;showMonth.setText(+month);calendarMessage.setMonth(month);calendarPad.setCalendarMessage(calendarMessage);calendarPad.showMonthCalendar();notePad.setShowMessage(year,month,day);doMark();else if(e.getSource()=showYear)String s=showYear.getText().trim();char a=s.toCharArray();boolean boo=false;for(int i=0;ia.length;i+)if(!(Character.isDigit(ai)boo=true;if(boo=true)/弹出“警告”消息对话框 JOptionPane.showMessageDialog(this,您 输 入 了 非 法 年 份,警告,JOptionPane.WARNING_MESSAGE);else if(boo=false)year=Integer.parseInt(s);showYear.setText(+year);calendarMessage.setYear(year);calendarPad.setCalendarMessage(calendarMessage);calendarPad.showMonthCalendar();notePad.setShowMessage(year,month,day);doMark();else if(e.getSource()=saveDailyRecord)notePad.save(dir,year,month,day);doMark();else if(e.getSource()=deleteDailyRecord)notePad.delete(dir,year,month,day);doMark();else if(e.getSource()=readDailyRecord)notePad.read(dir,year,month,day);public void mousePressed(MouseEvent e)JTextField text=(JTextField)e.getSource();String str=text.getText().trim();try day=Integer.parseInt(str);名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 29 页 -20 楷 catch(NumberFormatException exp)calendarMessage.setDay(day);notePad.setShowMessage(year,month,day);public void mouseReleased(MouseEvent e)public void mouseEntered(MouseEvent e)public void mouseExited(MouseEvent e)public void mouseClicked(MouseEvent e)public void focusGained(FocusEvent e)Component com=(Component)e.getSource();com.setBackground(Color.pink);public void focusLost(FocusEvent e)Component com=(Component)e.getSource();com.setBackground(backColor);public void doMark()for(int i=0;ishowDay.length;i+)showDayi.removeAll();String str=showDayi.getText().trim();try int n=Integer.parseInt(str);if(isHaveDailyRecord(n)=true)/见后面的isHaveDailyRecord()方法 JLabel mess=new JLabel(有);mess.setFont(new Font(TimesRoman,Font.PLAIN,11);mess.setForeground(Color.blue);showDayi.add(mess);catch(Exception exp)calendarPad.repaint();calendarPad.validate();public boolean isHaveDailyRecord(int n)String key=+year+month+n;String dayFile=dir.list();boolean boo=false;for(int k=0;kdayFile.length;k+)if(dayFilek.equals(key+.txt)boo=true;名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 29 页 -21 楷 break;return boo;public static void main(String args)new CalendarWindow();、import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.awt.geom.*;import java.util.*;import java.io.*;import .*;import java.applet.*;public class Clock extends JPanel implements ActionListener Date date;javax.swing.Timer secondTime;int hour,munite,second;Line2D secondLine,muniteLine,hourLine;int a,b,c,width,height;double pointSX=new double60,/用来表示秒针端点坐标的数组 pointSY=new double60,pointMX=new double60,/用来表示分针端点坐标的数组 pointMY=new double60,pointHX=new double60,/用来表示时针端点坐标的数组 pointHY=new double60;Clock()setBackground(Color.cyan);initPoint();secondTime=new javax.swing.Timer(1000,this);secondLine=new Line2D.Double(0,0,0,0);muniteLine=new Line2D.Double(0,0,0,0);hourLine=new Line2D.Double(0,0,0,0);secondTime.start();/秒针开始计时 private void initPoint()width=getBounds().width;height=getBounds().height;pointSX0=0;/12点秒针位置名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 29 页 -22 楷 pointSY0=-height/2*5/6;pointMX0=0;/12点分针位置 pointMY0=-(height/2*4/5);pointHX0=0;/12点时针位置 pointHY0=-(height/2*2/3);double angle=6*Math.PI/180;/刻度为 6 度 for(int i=0;i59;i+)/计算数组中的坐标pointSXi+1=pointSXi*Math.cos(angle)-Math.sin(angle)*pointSYi;pointSYi+1=pointSYi*Math.cos(angle)+pointSXi*Math.sin(angle);pointMXi+1=pointMXi*Math.cos(angle)-Math.sin(angle)*pointMYi;pointMYi+1=pointMYi*Math.cos(angle)+pointMXi*Math.sin(angle);pointHXi+1=pointHXi*Math.cos(angle)-Math.sin(angle)*pointHYi;pointHYi+1=pointHYi*Math.cos(angle)+pointHXi*Math.sin(angle);for(int i=0;i60;i+)pointSXi=pointSXi+width/2;/坐标平移 pointSYi=pointSYi+height/2;pointMXi=pointMXi+width/2;/坐标平移 pointMYi=pointMYi+height/2;pointHXi=pointHXi+width/2;/坐标平移 pointHYi=pointHYi+height/2;public void paintComponent(Graphics g)super.paintComponent(g);initPoint();for(int i=0;i60;i+)/绘制表盘上的小刻度和大刻度 int m=(int)pointSXi;int n=(int)pointSYi;if(i%5=0)if(i=0|i=15|i=30|i=45)int k=10;g.setColor(Color.orange);g.fillOval(m-k/2,n-k/2,k,k);else int k=7;g.setColor(Color.orange);名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 29 页 -23 楷 g.fillOval(m-k/2,n-k/2,k,k);else int k=2;g.setColor(Color.black);g.fillOval(m-k/2,n-k/2,k,k);g.fillOval(width/2-5,height/2-5,10,10);/钟表中心的实心圆 Graphics2D g_2d=(Graphics2D)g;g_2d.setColor(Color.red);g_2d.draw(secondLine);BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);g_2d.setColor(Color.blue);g_2d.draw(muniteLine);bs=new BasicStroke(4f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);g_2d.setColor(Color.orange);g_2d.draw(hourLine);public void actionPerformed(ActionEvent e)if(e.getSource()=secondTime)date=new Date();String s=date.toString();hour=Integer.parseInt(s.substring(11,13);munite=Integer.parseInt(s.substring(14,16);second=Integer.parseInt(s.substring(17,19);/获取时间中的秒 int h=hour%12;a=second;/秒针端点的坐标 b=munite;/分针端点的坐标 c=h*5+munite/12;/时针端点的坐标secondLine.setLine(width/2,height/2,(int)pointSXa,(int)pointSYa);muniteLine.setLine(width/2,height/2,(int)pointMXb,(int)pointMYb);hourLine.setLine(width/2,height/2,(int)pointHXc,(int)pointHYc);repaint();名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 29 页 -24 楷 if(second=0)File musicFile=new File(01.wav);try URI uri=musicFile.toURI();URL url=uri.toURL();AudioClip clip=Applet.newAudioClip(url);clip.play();catch(MalformedURLException e1)e1.printStackTrace();、import