软件工程课程设计报告完成.doc
滨江学院软件工程课程设计报告( 2012 - 2013 年度第 2 学期)课程名称: 软件工程课程设计 题 目: Windows绘图板的设计与实现 院 系: 计算机系 班 级: 10软工3班 学 号: 姓 名: 吴天娇 指导教师: 李振宏 设计周数: 两周 日期:2013 年 6 月 4 日摘要:Windows画图板系统的开发最主要包括前端应用程序的开发。对前端应用程序的开发要求应用程序功能完备,易使用,界面美观等特点。本次课程设计主要是用JAVA实现画笔系统,其系统主要完成以下功能:Windows画图板系统主要实现文件的新建,保存,颜色的编辑,设计一个画图程序,能够实现画笔、画箭头、画直线、画圆形、画椭圆、画矩形、画多边形、书写文字修改该画笔的大小以及颜色。该画图程序还需具有橡皮擦功能以及清空整个画面的功能。关键词:Windows绘图板 Java一、 课程设计的目的与要求目的:采用面向对象编程技术,设计并实现一个功能完善的Windows绘图板程序。通过实际程序的开发,熟练面向对象程序设计方法,掌握桌面程序设计技巧,熟悉.NET或Java开发环境。任务:1. 开发一个功能完善的Windows绘图板程序,功能包括:新建空白文档、文件保存、绘制一些基本的图形组件(直线、矩形、实心矩形、椭圆、实心椭圆、圆、实心圆、圆角矩形、实心圆角矩形等)、橡皮擦、添加文字等;2. 完成软件开发文档编写;3. 给出程序运行、测试的详细结果。4. 进一步加强和提高软件工程文档的编写能力;5. 培养协作能力和团队精神。二、设计正文1 概述1.1课题题目:Windows绘图板的设计与实现1.2系统的主要目标:本系统目标是实现Windows绘图板软件功能概述l 新建一个空白图形文件:用于绘制新的图形。l 打开或保存一个图形文件,便于对图形文件的管理。l 绘制一些基本的图形组件:直线,矩形,实心矩形,椭圆,实心椭圆,圆,实心圆,圆角矩形,实心圆角矩形等。l 用鼠标在绘图板上单击拖动进行随笔花。l 橡皮擦:可以将已绘制的图形擦掉。l 添加文字:可以在绘图区域内添加文字。l 选择文字的字体:通过一个下拉式的选择条,可以选中所需要的字体。本程序中包括:宋体,隶书,华文彩云,仿宋-GB2312,华文行楷,Times New Roman,Serif,Monospaced,SonsSerif,Garamond。当然,在下面的程序分析中可以看到,由于设置了字体选择数组,使得可以随意添加系统支持的任何字体。大大方便和简化了程序设计。l 选择文字的字体风格:通过两个复选框按钮,可以选择需要的字体风格,包括:粗体,斜体,用同时选中两者,只选择其中一种或两者都不选中3种选择方式。l 设置画笔的颜色:可以选择当前绘制图形的画笔颜色,让图形更加丰富多彩,生动活泼。l 设置画笔的粗细:该选项在作用于基本图形组件和文字时,它的效果是不同的。当作用于绘制图形组建时,它的作用是改变画笔绘制线条的粗细;当作用于文字时,它的作用是改变文字的大小。1.3 系统的开发环境及运行环境:操作系统: Windows XP Pro SP2建模工具: Rational Rose 2003开发工具: eclipseWeb服务器:IIS+ASP.NET 2.0平台2 系统需求分析2.1绘图板的功能分析: 该系统所要实现的功能如下: (1)“橡皮”的功能:用来画出的图形。 (2)“铅笔”的功能:用来画出的任意直线。(3)“直线”的功能:用来让用户更好的画出的直线。(4)“刷子”的功能:用来让用户更好的画出的图形。(5)“吸管”的功能:用来让用户得到图片的颜色。(6)“字体”的功能:用来让用户写出自己的字体。(7)“多边形”的功能:用来让用户更好的画出的多边形。(8)“椭圆”的功能:用来让用户更好的画出的椭圆。(9)“画函数”的功能:根据用户的输入画出函数图形。(10)“圆角矩形”、“矩形”、“填充”、“选择颜色”等功能:用来让用户更好的实用该绘图板功能。2.2用户界面需求和性能分析:Windows绘图板主要是为用户提供基本画图工具。所以以提供用户最需要的功能为目的。设计性能如下: (1) 让用户不管怎样操作都能得到用户的目的,争取做到傻瓜都能使用该软件。 (2) 较windows绘图板增加了生成函数图象的功能,能实现绘制一些基本的图形组件(直线、 矩形、实心矩形、椭圆、实心椭圆、圆、实心圆、圆角矩形、实心圆角矩形等)、橡皮擦、添加文字等。 (3)其他的实现了windows绘图板的大部分功能:铅笔、橡皮、刷子、直线、选择颜色等等功能。2.3 用例图图2 绘图板用例图用例图说明:(1)系统的外部角色有:paintings。(2)系统主要用例的文档描述:painting可见的功能,包含了pencil、word、circle、fillcircle、painting、rubber、filloval、filloval、fillrect、oval、line、reck。2.4 类图图2 绘图板类图类图说明:1.工具接口Tool:从图中可以看到,工具接口Tool 定义了鼠标动作的四个方法,分别是拖动mouseDrapped()、移动mouseMoved()、松开mouseReleased()、按下mousePressed()、点击mouseClicked()五个动作,并用String 类型的常量属性来定义工具的类型。这个接口只有一个实现类AbstractTool,而每个工具类都是去扩展AbstractTool 类,在图中表现为Tool1、Tool2.ToolN。2.Tool的实现类AbstractToolAbstractTool 是Tool 的实现类,也是一个抽像类,所以并不能被创建,只能被继承。此类实现Tool中定义的所有方法,并扩展了其它方法,让其子类继承或者重写。该类中为其他的工具类提供了大部分的实现,那么它的子类就可以不必再做重复的实现,只关心与本类相关的逻辑,3.AbstractTool的子类AbstractTool 一共有ArrowTool(箭头)、PencilTool(铅笔)、BrushTool(刷子)、EraserTool(橡皮擦)、LineTool (直线)、RectTool (矩形)、PolygonTool (多边形)、RoundTool (椭圆形)、RoundRectTool(圆矩形)、AtomizerTool(喷墨)、ColorPickedTool(颜色选择)11 个子类,4. 界面类ImageFrame这个画图工具的界面的主要放在这个类中实现5. 业务逻辑类ImageService除鼠标的画图功能外(画图功能由Tool 的实现类完成),初始化画板、图片的新建打开与保存、各种面板的显示与隐藏、颜色的编辑、整个界面的刷新、菜单等业务逻辑都放在这个类中实现,对象,它并没有保存一些状态属性。6 .文件选择类ImageFileChooserImageFileChooser 类继承了JFleChooser 类,JFleChooser 是Java 提供的一个简单的文件选择机制,我们这里扩展这个类,是为了增加我们自己的文件过滤器。3. 系统总体设计3.1设计准备(1)此程序为实现这些功能模块,必须首先定义一个工具面板,将这些画笔、画箭头、椭圆、圆、多边形直线、画矩形、画笔颜色、画笔大小、橡皮等功能组件放入这个工具面板中。(2)此程序为实现利用鼠标做画笔的功能,必会产生鼠标事件MouseEvent。因此,为实现鼠标画图的功能,必须用到鼠标触发事件,故在此程序中,必须实现“委托事件模型”,用到事件源、事件对象以及监听者对象。(3)此程序中,必须用到的包如下:import java.awt.*;import java.awt.geom.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import java.util.*;(4)需用到的类l class DrawPad 这个类是主类,是程序得以运行的入口。在这个主类中定义了主方法,是该程序执行的入口。l class SimpleDrawPad 此类用于实现这个程序的大部分功能,在这个类中除了定义一些基本变量以及构造函数外,还定义了很多成员方法,这些成员方法将实现鼠标触发事件的一系列绘图功能。l class ButtonDealer(SimpleDrawPad内部类)按钮侦听器ButtonDealer类,内部类,用来侦听基本按钮的操作。l class ButtonDealer1(SimpleDrawPad内部类) 按钮侦听器ButtonDealer1类,用来侦听颜色选择、画笔粗细设置、文字输入按钮的操作。l class mouseA(SimpleDrawPad内部类) 鼠标事件mouseA类,继承了MouseAdapter,用来完成鼠标相应事件操作。l class mouseB(SimpleDrawPad内部类) 鼠标事件mouseB类继承了MouseMotionAdapter,用来完成鼠标拖动和鼠标移动时的相应操作。l class checkBoxHandler(SimpleDrawPad内部类) 选择字体风格时候用到的事件侦听器类,加入到字体风格的选择框中l class DrawPanel(SimpleDrawPad内部类) 画图面板类,用来画图。l class drawings 定义画图的基本图形单元。l class Line 继承class drawings 实现画直线功能。l class Rect 继承class drawings 实现画矩形功能。l class fillRect 继承class drawings 实现画实心矩形功能。l class Oval 继承class drawings 实现画椭圆功能。l class fillOval 继承class drawings 实现画实心椭圆功能。l class Circle 继承 class drawings 实现画圆功能。l class fillCircle 继承 class drawings 实现画实心圆功能。l class Pencil 继承 class drawings 实现自定义绘画功能。l class Rubber 继承 class drawings 实现清除图案功能。l class word 继承 class drawings 实现输入文字功能。(5)画板主要由以下几个部分组成:主窗体的设计:主类(painter)用来生成主界面,完成画图板的主要框架。主类由JFrame派生出来。主界面由菜单栏、工具栏和画图区域三部分组成,布局格式采用BorderLayout布局形式。l 菜单栏的设计。菜单栏包括文件菜单栏、颜色菜单栏、线条粗细菜单栏和提示菜单栏。其中文件菜单栏包括文件的新建、打开、保存等选项;颜色菜单栏可以进行颜色选择;线条粗细菜单栏设置线条的粗细;提示菜单栏给出提示信息。工具栏由新建、打开和保存文件按钮、基本图形的按钮、选择字体风格复选框和字体下拉列表框组成。主类中添加并对菜单栏和工具栏添加事件监听。l 事件响应的处理。对菜单栏、工具栏和用鼠标画图的事件响应进行处理。菜单栏中文件的新建、打开和保存菜单事件的处理:Java把每个文件都视作顺序字节流。如果要在Java中进行文件处理,则必须用到Java.io包。这个包定义了一些流类,选用FileInputStream(从文件中读入数据)和FIleOutputStream(向文件输出数据),通过建立这些文件的对象便可以打开文件。这些流相应地从InputStream和OutputStream派生,这些文件均使用文件流,所以必须将文件结构化以适应程序的要求。我们需要对保存的对象序列化,然后以输出流的方式保存。在程序中用newFile()、loadFile()和saveFile()三个函数分别实现文件的新建、打开和保存。l 工具栏事件的处理:主要有一些Button组成。我们用ButtonHandler内部类处理基本单元事件,ButtonHandler1内部类处理新建、打开和保存文件按钮,在画图类DrawPanel中定义CreateNewItem()函数处理工具栏中的画图事件。l 鼠标画图:由于画图板主要是用来画图,所以需要在程序中添加对鼠标按下、拖动、进入、退出、移动和单机事件进行监听并进行处理。内部类mouseA定义了完成鼠标按下、松开、进入、退出事件响应。内部类mouseB完成鼠标拖动和移动事件响应。画图的基本功能。在程序设计中用到了动态绑定,我们可以提取他们的公共属性,先建立一个父类,然后建立各个子类,继承父类中的方法并将父类中的draw函数重写。一些关于图形形状的类,最主要是用于画图、字体和橡皮擦等基本类型。如Circle、Triangle、Rectangle,它们都是有超类(Object类)派生的。在面向对象编程中,每个类都有画出自己的能力,每个类都有自己的draw函数,但每种形状的draw函数都不一样,但在绘制任何形状时,只需简单调用父类drawing的draw方法,然后让程序动态地根据对象的类型决定使用哪个子类的draw方法。为了使画出的图形更加美观,我们在draw函数中使用了Graphics2D的对象的引用。这样可以在不改变原程序的情况下,添加扩展的图形,是程序变得更加强大。同时,为了文件的保存,父类实现Serialize接口,将对象线性化。(1) 总体设计图图2-1 总体设计流程(2)各模块功能表3-1 绘图板系统功能模块表功能模块包含子功能模块功能文件模块新建模块新建画图板打开模块打开已经存在的模板保存和退出模块对画图板进行保存,保存之后退出颜色选择模块实现颜色的选取设直线条粗细模块实现颜色线条粗细的选择帮助模块包括绘图板的使用说明4 详细设计4.1 系统各功能实现(1)一组基本图形按钮,包括:Pencil(随笔画)、Line(直线)、Rect(矩形)、FRect(实心矩形)、Ov(椭圆)、FOval(实心椭圆)、Circle(圆)、FCircle(实心圆)、RoundRect(圆角矩形)、FrRect(实心圆角矩形)、Rubber(橡皮擦)、Word(文字)。这些基本图形都继承于同一个父类:drawings。drawings 具有变量(属性):int x1,x2,y1,y2; /用来存放相应图形元素的坐标int R,G,B; /用来存放图形色彩颜色信息float stroke; /用来存放画笔粗细int type; /用来保存图形类型String s1; /用来保存输入文字字符串String s2; /用来保存字体类型字符串void draw ( Graphics2D g2d ) ;draw()方法中用到了Java绘图里面的Graphics2D类,所有继承drawings类的图形子类都重写了此方法。这就是Java程序中类的继承的概念。它对于程序代码的重用是很重要的,将极大的方便和简略程序代码。(2)程序中还包括一下三个基本操作按钮:a)新建(New):新建一个图形文件。b)打开(Open):打开一个图形文件。c)保存(Save):保存当前图形文件。(3)选择颜色和设置当前画笔粗细的按钮分别为:颜色(Color)、线条粗细(Stroke)。(4)选择当前字体风格的选择框为:粗体(BOLD)、斜体(ITALIC),用以设置当前字体的风格。(5)选择当前字体的下拉式复选框为:Styles。4.2 菜单条及其组成:a) 文件(File)菜单项,包括:New(新建一个图形文件)、Load(打开一个图形文件)、Save(保存当前图形文件)、Exit(退出程序)。b) 颜色(Color)菜单项:用来设置当前颜色。c) 线条粗细(Stroke)菜单项:用来设置当前画笔粗细。d) 帮助(Help)菜单项:有关的程序帮助提示。本程序主体为一个文件:MiniDrawPad.java。其中包括的程序段有: MiniDrawPad():构造函数,用以初始化。 chooseColor():选择当前绘图颜色程序段。 setStroke():设置当前画笔粗细程序段。 loadFile():调用图形文件程序段。 newFile():新建一个图形文件程序段。 saveFile():保存当前所绘制图形程序段。 creatNewItem():新建一个基本图形单元程序段。相应的内部类有: ButtonHandler:用来处理基本图形单元的按钮事件。 ButtonHandler1:用来处理颜色、画壁粗细、文字输入三个操作按钮的按钮事件。 DrawPanel:用来创建绘图区域的子类。 MouseA:继承了MouseAdapter,用来完成鼠标相应事件的操作,如单击、松开、进入和离开等。 MouseB:继承MouseMotionAdapter,用来完成鼠标拖动和鼠标移动的相应事件操作。此外,还继承了父类drawings的基本图形子类,如前所述,这里不再重复。 打开菜单栏编辑器添加菜单项目,添加可见控件 控件名要更改的属性名更改后的属性名Picture3(0)backcolor选黑色Picture3(1)backcolor选红色Picture3(2)backcolor选黄色Picture3(3)backcolor选蓝色Prame1Caption颜色Prame2Caption线型Prame3Caption线宽Command1Caption清空Command2Caption涂鸦CommonDialog1Filename我的画图CommonDialog2Filter.bmp 打开菜单栏编辑器添加菜单项目,添加图片框控件里line及shape,现在相应位置画好图形再按下表更改属性 控件名要改的属性名更改后的属性名Line2borderstyle2-DashLine3borderstyle3-DotLine6borderwidth2Line7borderwidth3Shape1shape3-CircleShape2shape0-RectangleShape3shape2-Oval DrawPanel:用来创建绘图区域的子类。文件名功能ImageAction.java按键处理类ImageFileChooser.java文件选择ImageFrame.java界面显示,布局ImageService.java除界面外的其他功能(文件保存打开等)Main.java主函数MyImage.java创建图片类对象AbstractTool.java所用工具共同的方法(抽象类)AtomizerTool.java喷枪工具BrushTool.java刷子工具ColorPickedTool.java拾色器EraserTool.java橡皮工具LineTool.java直线工具PencilTool.java铅笔工具PolygonTool.java多边形工具RectTool.java矩形工具RoundRectTool.java圆矩形工具RoundTool.java椭圆形工具Tool.java定义工具类5.2类的方法介绍 定义的变量:在这个类中,首先定义了画笔的大小、画笔的颜色、画笔的粗细、橡皮的大小、工具的选择等一些变量,并且还用到了系统中自带的一些类初使化了一些面板工具对象,用于完成对面板工具、画直线、画椭圆、画矩形、橡皮擦、清除等一些工具按钮的定义。 初使化构造函数:在这个初使化构造函数中,首先继承了父类Frame,然后初使化了各工具按钮以及各个选择项,包括颜色选择、画笔大小选择、橡皮大小选择,并且将这些组件添加到了工具面板中,最后还对各个组件注册了事件监听者对象。 paint()方法:这个方法主要用于在Applet的界面中显示文字、图形和其它界面元素。本程序中,在这个方法中,定义了一些工具选项设置,给用户选择画笔、画直线、画圆、橡皮擦等一些功能。 itemStateChanged()方法: 这个方法用来实现的功能很简单,主要是用来改变画笔大小、画笔颜色、橡皮大小的。在此方法中,设置了大小以及颜色的一些预选项,以供用户对大小以及颜色做出选择。 mouseDragged()方法:此方法是处理MouseEvent事件以实现MouseMotionListener接口的对象。MouseMotionListener是事件监听者,mouseDragged(MouseEvent e)是成员方法,代表鼠标拖动事件,在这个方法中,还用到了MouseEvent类常用成员方法:public int getX()以及public int getY(),用来返回发生鼠标事件的X及Y的坐标。这个方法中,主要用来控件画笔和橡皮的转换。 mousePressed()方法: 此方法是处理MouseEvent事件以实现MouseListener接口的对象。MouseListener是事件监听者,mouseDPressed(MouseEvent e)是成员方法,代表鼠标按下事件。这个方法主要用来控件用户画直线、画圆、画矩形这些功能之间的转换。 mouseReleased()方法:mouseEntered()方法:mouseExited()方法:mouseClicked()方法:这些方法和mousePressed()方法属于同一类,他主要用来表示鼠标释放事件,是对上述各个功能完成后对鼠标事件的又一次触发。(二)画图板相关操作1.新建一个图形文件单击工具栏上的图标,或选择FileNew菜单,则清除当前所绘制的图像,回到初始画面。2.打开已有的文件单击工具栏上的图标,或选择FileLoad菜单,则清除当前所绘制的图像,并弹出打开文件对话框要求选择要打开的文件。3.保存单击工具栏上的图标,或选择FileSave菜单,则弹出要求保存文件对话框。鼠标单击工具栏相应图形的图标时,在菜单栏下面就会出现各工具相应的属性,例如当选中椭圆工具时,就会出现有关椭圆的属性(设置线条的宽度,线条的样式:实线或虚线,线条的平滑与否,以及内部是否填充颜色)4. 基本图形包括以下几种:Pencil:随笔画,图标为:。 Line:直线,图标为:。Curve:曲线,图标为:。 Rect:矩形,图标为:。Ellipse:椭圆,图标为:。 Circle:圆,图标为:。RoundRect:圆角矩形,图标为:。 Eraser:橡皮擦,图标为:。RectSelect:椭圆选择工具,图标为:。 PaintBucket:颜色填充,图标为:。Font:文本,图标为:。 ColorPicker:颜色选取器,图标为:。绘图时,单击工具栏上相应图形的图标,然后用鼠标拖动,在绘图区域内进行绘图即可。5. 设置画笔大小单击工具栏上的图标,或单击StrokeSet Stroke菜单,则弹出相应的设置当前画笔粗细对话框。6. 选择颜色单击工具栏区域,或单击ColorChoose Color菜单,则弹出相应的选择当前画图颜色对话框。也可设置线条颜色(矩形等内部的填充颜色)。三、课程设计总结或结论为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识进行再创造,学校特安排我们进行为期二周的java课程设计实习,并安排了指导老师帮助辅导,让我们在规范化、严谨化、实用化上面有了很大进展。在此次Windows绘图板程序开发过程中,有很多东西值得我们思考并总结。开发过程大体可分为以下几个步骤:(1)思考总体设计方案:总体结构和模块外部设计,功能分配。思考要实现整个程序大体需要的几个模块和其中用到的java语言基本操作符、语句等。(2)画出总体设计方案流程图:用流程图的形式展现你的基本编程思想。(3)流程图具体化:即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现并想好实现的关键代码。(4)编辑程序代码:这是一个至关重要复杂而且需要反复修改的环节,在此环节中你将发现总体设计和模块思想会存在很多问题,需不断改进如何实现各函数功能,达到预期效果也将是一项繁复的工作。(5)代码的调试:在eclipse环境下输入代码并进行调试和正确运行。在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。(6)最后修饰:程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化增强程序的新意与可行性。通过这次课程设计,使我们更加熟悉的掌握了java语言的运用。帮助我们熟悉了更多java语言的功能,提高了我们的动手能力,学到了许多解决实际问题的宝贵经验同时也挖掘出了我们潜在的能力,使我们对自己更有自信,对编程也更有兴趣。我相信,只要努力、勤奋、坚持不懈,就没有什么做不到的事,不能还没开始就退缩,要勇于拼搏,敢于创新。四、参考文献1 清华大学出版社的java2实用教程(第三版),张跃平、耿祥义著。2 清华大学出版社的java程序设计,陈勇孝著。3 清华大学出版社的Java就业培训教程,张孝祥著。