资源描述
西安科技大学
软件工程课程设计报告
题目:画图板应用程序开发
班级
学号:
姓名:
2023年12月
目 录
1 绪论…………………………………………………………………………3
2 可行性研究报告……………………………………………………………3
3 需求分析报告………………………………………………………………4
4 总体设计报告………………………………………………………………7
5 具体设计报告………………………………………………………………8
6 系统实现报告………………………………………………………………12
7软件测试报告………………………………………………………………32
参考文献
1、绪论
1.1 目的和意义
用过微软Windows操作系统的人一定都对Windows自带的画图板非常熟悉了。同图像解决软件界的老大Photoshop比起来,它虽然不及Photoshop的功能强大,内容丰富,但是作为Windows一直以来都内带的附件程序,它具有小巧玲珑,简朴实用等其他绘图软件所不具有的优点。同时它的风格也被许多其他的绘图软件所仿效。
作为一个软件工程专业的学生自己也想亲自动手编写一个属于自己的,简朴实用的绘图程序。通过本次课程设计可以增长对整个流程的熟悉以及对程序组织结构和框架的理解,对以后开发和设计更大更复杂的程序无疑有更大的帮助。
1.2 任务
书写开发文档,分析和制定整个开发过程,然后开发一个自己的画图板应用程序。
2、可行性研究报告
2.1 进行可行性研究的方法
本应用程序可行性研究是通过对比windows自带的画板程序的方式进行的,对Windows里面的画板进行分析研究,分析得出本应用软件应当实现的基本功能,并根据自己的能力进行了功能上的增长。
2.2 评价尺度
本软件在评价时应从以下几个方面进行分析:
开发时间应尽量短;
功能实现的代码应尽量少;
代码执行效率要高;
有较强的容错能力;
2.3技术方面的可行性
系统现阶段的发展过程中,运用现有人力和物力是完全具有的能力开发出来的,作为阶段性产品,日后的发展空间大,实现方法逐步简朴容易,所以画图板应用程序在技术上是完全可行的。
a. 在当前的限制条件下,该程序的功能目的能达成;
b. 运用现有的技术,该程序的功能可以实现;
c. 由于能力的局限性,现阶段的功能不够完美,还可以在日后完善;
d. 在规定的限期内,本程序可以完毕;
2.4法律方面的可行性
本程序不会在后台扫描用户的磁盘文献;
本程序为完全免费,没有任何赚钱行为,并且仅在内部流通,不予推广,所以不涉及浸犯微软版权的行为,所以本软件完全合法。
软件服务条款要与中华人民共和国的法律解释相一致,一致批准服从高等法院所有管辖。如发生软件服务条款与中华人民共和国法律相抵触时,则这些条款将完全按法律规定重新解释,而其它条款则依旧保持对用户产生法律效力和影响。
2.3 经济可行行
本系统开发成本低,不需要特殊规定。
2.4 可行性结论
综上所述,本应用程序在技术上可行,经济上可行,操作上可行,因此本应用程序可立即着手开发。
3、需求分析报告
对软件需求完全理解对于软件开发工作的成功是至关重要的,需求说明的任务是发现、规范的过程,有益于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,便于采用工程方法开发软件,提高软件的质量,便于开发人员、维护人员、管理人员之间的交流、协作,并作为工作成果的原始依据,并且在向潜在用户传递软件功能、性能需求,使其可以判断该软件是否与自己的需求相关。
3.1 编写目的
为开发人员,维护人员,客户之间提供共同的协议而创建基础,对本画图板软件功能的实现做一全面的描述;
本说明书预期读者为客户、业务或需求分析人员、测试人员、文档编写者、项目管理人员;
3.2 任务概述
本软件进攻学习、研究之用,目的是让使用该软件的用户感觉可以轻松的掌握本软件的各个功能模块。为了方便用户使用,本软件在设计时尽量追求可操作性和简洁大方的人机交互界面的设计,力求尽量减少用户直接输入性的东西,大量使用可选框。
3.3 功能概述
通过各方面的了解,本软件初步设计的功能为:
1. 新建一个空白图形文献:用于绘制新的图形。
2. 打开或保存一个图形文献,便于对图形文献的管理。
3. 绘制一些基本的图形组件:直线,矩形,实心矩形,椭圆,实心椭圆,圆,实心圆,圆角矩形,实心圆角矩形等。
4. 用鼠标在绘图板上单击拖动进行随笔花。
5. 橡皮擦:可以将已绘制的图形擦掉。
6. 添加文字:可以在绘图区域内添加文字。
7. 选择文字的字体:通过一个下拉式的选择条,可以选中所需要的字体。本程序中涉及:宋体,隶书,华文彩云,仿宋-GB2312,华文行楷,Times New Roman,Serif,Monospaced,SonsSerif,Garamond。当然,在下面的程序分析中可以看到,由于设立了字体选择数组,使得可以随意添加系统支持的任何字体。大大方便和简化了程序设计。
8. 选择文字的字体风格:通过两个复选框按钮,可以选择需要的字体风格,涉及:粗体,斜体,用同时选中两者,只选择其中一种或两者都不选中3种选择方式。
9. 设立画笔的颜色:可以选择当前绘制图形的画笔颜色,让图形更加丰富多彩,生动活泼。
10. 设立画笔的粗细:该选项在作用于基本图形组件和文字时,它的效果是不同的。当作用于绘制图形组建时,它的作用是改变画笔绘制线条的粗细;当作用于文字时,它的作用是改变文字的大小。
由此可以看出,虽然这个画图板程序不如那些专业的绘图程序,但是,“麻雀虽小五脏俱全”,它已经具有了一个绘图软件所应当有的基本功能和操作。
3.4 功能结构图
图3-1 软件功能层次图
3.5 用例图
用例图
4、总体设计报告
4.1 编写目的
总体设计的目的就是回答“概括的说,系统该如何实现?”这个问题,也就是说这个说明书的编写目的就是告诉程序员和软件设计人员本软件的系统结构和软件结构。
4.2 本软件的系统层次结构图
图3-1 是该软件的系统层次结构图。
4.3 基本图形按钮
基本图形按钮涉及:Pencil(随笔画)、Line(直线)、Rect(矩形)、fRect(实心矩形)、Oval(椭圆)、fOval(实心椭圆)、Circle(圆)、fCircle(实心圆)、RoundRect(圆角矩形)、frrect(实心圆角矩形)、Rubber(橡皮擦)、Word(字)。
基本图形都继承自同一个父类:drawings。Drawings具有的变量(属性):
int x1, y1, x2, y2; //用来存放相应图形元素的左边
int R, G, B; //用来存放图形色彩信息
float stroke; //用来存放画笔粗细
int type; //用来保存图形类型
string s1; //用来保存输入文字字符串
string s2; //用来保存字体类型字符串
同时,drawings尚有方法:
Void draw(Graphics2D g2d) {};
draw()方法中用到了java绘图里面的Graphics2D类,所有继承drawings类的图形子类都重写此方法。这就是Java中类继承的概念。
4.4 基本操作按钮
1. New:新建一个图形文献。
2. Open:打开一个图形文献。
3. Save:保存当前图形文献。
4.5 菜单条及其组成
1. File菜单项,涉及:New(新建一个图形文献)、Load(打开一个图形文献)、Save(保存一个图形文献)、Exit(退出程序)。
2. Color菜单项:用来设立当前颜色。
3. Stroke菜单项:用来设立当前画笔粗细。
4. Help菜单项:有关的程序帮助提醒。
4.6 其他功能组成
1. 选择颜色和设立当前画笔粗细的按钮分别为:Color、Stroke。
2. 选择当前字体风格的选择框为:BOLD、ITALIC,用以设立当前字体的风格。
3. 选择当前字体的下来是复选框为:Styles。
4.7 完毕的程序界面效果为:
图4-1 完毕的程序界面效果图
5、具体设计报告
5.1 编写目的
具体设计阶段的主线目的是拟定应当怎么具体地实现所规定的系统,也就是说,通过这个阶段的设计工作,应当得出对目的系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种设计语言书写的程序。本说明书是为了给程序员提供出一个程序的“蓝图”,指导他们更好地完毕编码任务。
本说明书的读者是:软件设计师、所有参与这个项目的编码人员和测试人员。
5.2 新建一个图形文献
单击工具栏上的图标,或选择Fileà New菜单,则清除当前所绘制的图像,回到初始画面,如图4-1所示。
5.3 打开已有的文献
单击工具栏上的图标,或选择FileàLoad菜单,则清除当前所绘制的图像,并弹出打开文献对话框规定选择打开的文献,如图5-1所示。
图5-1 选择打开文献对话框
5.4 保存
单击工具栏上的图标,或者选择FileàSave菜单,则弹出规定保存文献对话框,如图5-2所示。
图5-2 保存文献对话框
5.5 绘制基本图形
基本图形涉及:
1. Pencil:随笔画,图标为。
2. Line:直线,图标为。
3. Rect:矩形,图标为。
4. fRect:实心矩形,图标为。
5. Oval:椭圆,图标为。
6. fOval:实心椭圆,图标为。
7. Circle:圆,图标为。
8. Fcircle:实心圆,图标为。
9. RoundRect:圆角矩形,图标为。
10. frRect:实心圆角矩形,图标为。
11. Rubber:橡皮擦,图标为。
画图时,单击工具栏上相应图形的图标,然后用鼠标拖动,在绘图区域内进行绘画即可。
5.6 设立画笔大小
单击工具栏上的图标,或者单击StrokeàSet Stroke菜单,则弹出相应的设立当前画笔粗细对话框,如图5-3所示。
图5-3 设立当前画笔粗细对话框
5.7 选择颜色
单击工具栏上的图标,或单击ColoràChoose Color菜单,则弹出相应的选择当前画图颜色对话框,如图5-4所示。
图5-4 选择颜色对话框
5.8 选择字体风格
在工具栏区域,可以选择相应的字体风格,有粗体和斜体两种风格可供选择。
5.9选择字体
在工具栏区域,可以选择字体,本程序中有如下几种字体可供选择:宋体,隶书,华文彩云,仿宋-GB2312,华文行楷,Times New Roman,Serif,Monospaced,SonsSerif,Garamond。
5.10 程序结构说明
本程序主体文献为一个文献:MiniDrawPad.Java。其中涉及的程序段有:
1. MiniDrawPad():构造函数,用以初始化。
2. chooseColor():选择当前绘图颜色程序段。
3. setStroke():设立当前画笔粗细程序段。
4. loadFile():调用图形文献程序段。
5. newFile():新建一个图形文献程序段。
6. saveFile():保存当前所绘制图形程序段。
7. createNewItem():新建一个基本图形单元程序段。
相应的内部类有:
1. ButtonHandler:用来解决基本图形单元的按钮事件。
2. ButtonHandler1:用来解决New、Open、Save三个操作按钮的按钮事件。
3. DrawPanel:用老创建绘图区域的子类。
4. MouseA:继承了MouseAdapter,用来完毕鼠标相应事件的操作,如单击、松开、进入和离开等。
5. MouseB:继承了MouseMotionAdapter,用来完毕鼠标拖动和鼠标移动时的相应操作。
6、系统实现报告
6.1 开发环境
CPU:Intel Core(TM)2 E5300 内存:2G
运营平台:Windows XP 主频:2.60GHz
开发平台:Eclipse 主板:ASUSTeK Computer INC. P5QL-ASUS-SE
6.2 关键技术
本软件的关键技术有主窗体的设计、菜单栏和工具栏的设计、事件响应的解决、画图的基本功能的实现。
6.3 运营结果
1. 主界面框架
主界面类继承自JFrame类,涉及构造函数及各种功能的定义,重要代码如下 :
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class MiniDrawPad extends JFrame //主类,扩展了JFrame类,用来生成主界面
{
private ObjectInputStream input;
private ObjectOutputStream output; //定义输入输出流,用来调用和保存图像文献
private JButton choices[]; //按钮数组,存放以下名称的功能按钮
private String names[]={
"New",
"Open",
"Save", //这三个是基本操作按钮,涉及"新建"、"打开"、"保存"
"Pencil", //铅笔画,也就是用鼠标拖动着随意绘图
"Line", //绘制直线
"Rect", //绘制空心矩形
"fRect", //绘制以指定颜色填充的实心矩形
"Oval", //绘制空心椭圆
"fOval", //绘制以指定颜色填充的实心椭圆
"Circle", //绘制圆形
"fCircle", //绘制以指定颜色填充的实心圆形
"RoundRect", //绘制空心圆角矩形
"frRect", //绘制以指定颜色填充的实心圆角矩形
"Rubber", //橡皮擦,可用来擦去已经绘制好的图案
"Color", //选择颜色按钮,可用来选择需要的颜色
"Stroke", //选择线条粗细的按钮,输入需要的数值可以实现绘图线条粗细的变化
"Word" //输入文字按钮,可以在绘图板上实现文字输入
};
private String styleNames[]={
" 宋体 " , " 隶书 " , " 华文彩云 " , " 仿宋_GB2312 " , " 华文行楷 " ,
" 方正舒体 " , " Times New Roman " , " Serif " , " Monospaced " , " SonsSerif " , " Garamond "
}; //可供选择的字体项
private Icon items[];
private String tipText[]={
//这里是鼠标移动到相应按钮上面上停留时给出的提醒说明条
"Draw a new picture",
"Open a saved picture",
"Save current drawing",
"Draw at will",
"Draw a straight line",
"Draw a rectangle",
"Fill a ractangle",
"Draw an oval",
"Fill an oval",
"Draw a circle",
"Fill a circle",
"Draw a round rectangle",
"Fill a round rectangle",
"Erase at will",
"Choose current drawing color",
"Set current drawing stroke",
"Write down what u want"
};
JToolBar buttonPanel ; //定义按钮面板
private JLabel statusBar; //显示鼠标状态的提醒条
private DrawPanel drawingArea; //画图区域
private int width=800,height=550; //定义画图区域初始大小
drawings[] itemList=new drawings[5000]; //用来存放基本图形的数组
private int currentChoice=3; //设立默认画图状态为随笔画
int index=0; //当前已经绘制的图形数目
private Color color=Color.black; //当前画笔颜色
int R,G,B; //用来存放当前色彩值
int f1,f2; //用来存放当前字体风格
String style1; //用来存放当前字体
private float stroke=1.0f; //设立画笔粗细,默认值为1.0f
JCheckBox bold,italic; //定义字体风格选择框
//bold为粗体,italic为斜体,两者可以同时使用
JComboBox styles;
public MiniDrawPad() //构造函数
{
super("Drawing Pad");
JMenuBar bar=new JMenuBar(); //定义菜单条
JMenu fileMenu=new JMenu("File");
fileMenu.setMnemonic('F');
2. 新建、保存、打开、退出菜单项
代码如下:
//新建文献菜单条
JMenuItem newItem=new JMenuItem("New");
newItem.setMnemonic('N');
newItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
newFile(); //假如被触发,则调用新建文献函数段
}
}
);
fileMenu.add(newItem);
//保存文献菜单项
JMenuItem saveItem=new JMenuItem("Save");
saveItem.setMnemonic('S');
saveItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
saveFile(); //假如被触发,则调用保存文献函数段
}
}
);
fileMenu.add(saveItem);
//打开文献菜单项
JMenuItem loadItem=new JMenuItem("Load");
loadItem.setMnemonic('L');
loadItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
loadFile(); //假如被触发,则调用打开文献函数段
}
}
);
fileMenu.add(loadItem);
fileMenu.addSeparator();
//退出菜单项
JMenuItem exitItem=new JMenuItem("Exit");
exitItem.setMnemonic('X');
exitItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
System.exit(0); //假如被触发,则退出画图板程序
}
}
);
fileMenu.add(exitItem);
bar.add(fileMenu);
3. 线条宽度、颜色、提醒功能
代码如下:
//设立颜色菜单条
JMenu colorMenu=new JMenu("Color");
colorMenu.setMnemonic('C');
//选择颜色菜单项
JMenuItem colorItem=new JMenuItem("Choose Color");
colorItem.setMnemonic('O');
colorItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
chooseColor(); //假如被触发,则调用选择颜色函数段
}
}
);
colorMenu.add(colorItem);
bar.add(colorMenu);
//设立线条粗细菜单条
JMenu strokeMenu=new JMenu("Stroke");
strokeMenu.setMnemonic('S');
//设立线条粗细菜单项
JMenuItem strokeItem=new JMenuItem("Set Stroke");
strokeItem.setMnemonic('K');
strokeItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
setStroke();
}
}
);
strokeMenu.add(strokeItem);
bar.add(strokeMenu);
//设立提醒菜单条
JMenu helpMenu=new JMenu("Help");
helpMenu.setMnemonic('H');
//设立提醒菜单项
JMenuItem aboutItem=new JMenuItem("About this Drawing Pad!");
aboutItem.setMnemonic('A');
aboutItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(null,
"This is a mini drawing pad!\nBy Jian Yongkang ", " 画图板程序说明 ",JOptionPane.INFORMATION_MESSAGE );
}
}
);
helpMenu.add(aboutItem);
bar.add(helpMenu);
items=new ImageIcon[names.length];
4. 工具栏图形按钮功能实现
创建基本图形按钮、导入图标、加入动作侦听器、字体风格选择、字体选择、画图板等功能的实现。
代码如下:
//创建各种基本图形的按钮
drawingArea=new DrawPanel();
choices=new JButton[names.length];
buttonPanel = new JToolBar( JToolBar.VERTICAL ) ;
buttonPanel = new JToolBar( JToolBar.HORIZONTAL) ;
ButtonHandler handler=new ButtonHandler();
ButtonHandler1 handler1=new ButtonHandler1();
//导入图形图标,这些图标都存放在与源文献相同的目录下面
for(int i=0;i<choices.length;i++)
{
items[i]=new ImageIcon(names[i] + ".jpg");
choices[i]=new JButton("",items[i]);
choices[i].setToolTipText(tipText[i]);
buttonPanel.add(choices[i]);
}
//将动作侦听器加入按钮里面
for(int i=3;i<choices.length-3;i++)
{
choices[i].addActionListener(handler);
}
choices[0].addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
newFile();
}
}
);
choices[1].addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
loadFile();
}
}
);
choices[2].addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
saveFile();
}
}
);
choices[choices.length-3].addActionListener(handler1);
choices[choices.length-2].addActionListener(handler1);
choices[choices.length-1].addActionListener(handler1);
//字体风格选择
styles=new JComboBox(styleNames);
styles.setMaximumRowCount(8);
styles.addItemListener(
new ItemListener(){
public void itemStateChanged(ItemEvent e)
{
style1=styleNames[styles.getSelectedIndex()];
}
}
);
//字体选择
bold=new JCheckBox("BOLD");
italic=new JCheckBox("ITALIC");
checkBoxHandler cHandler=new checkBoxHandler();
bold.addItemListener(cHandler);
italic.addItemListener(cHandler);
JPanel wordPanel=new JPanel();
buttonPanel.add(bold);
buttonPanel.add(italic);
buttonPanel.add(styles);
styles.setMinimumSize( new Dimension ( 50, 20 ) );
styles.setMaximumSize(new Dimension ( 100, 20 ) );
Container c=getContentPane();
super.setJMenuBar( bar );
c.add(buttonPanel,BorderLayout.NORTH);
c.add(drawingArea,BorderLayout.CENTER);
statusBar=new JLabel();
c.add(statusBar,BorderLayout.SOUTH);
statusBar.setText(" Welcome To The Little Drawing Pad!!! :)");
createNewItem();
setSize(width,height);
show();
}
//按钮侦听器ButtonHanler类,内部类,用来侦听基本按钮的操作
public class ButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
for(int j=3;j<choices.length-3;j++)
{
if(e.getSource()==choices[j])
{currentChoice=j;
createNewItem();
repaint();}
}
}
}
//按钮侦听器ButtonHanler1类,用来侦听颜色选择、画笔粗细设立、文字输入按钮的操作
public class ButtonHandler1 implements ActionListener
{
展开阅读全文