资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
目 录1 课题介绍11.1 课程设计目的 11.2 课程设计要求 11.3 课程设计主要知识点 12 总体设计22.1 画板界面设计图 22.2 模块概述 22.2.1 文件操作.22.2.2 图形绘制.23 详细设计与实现43.1 框架类 DrawGraphic.43.1.1 菜单 .43.1.2 工具栏 .63.1.3 画图区域 .73.2 基本图形类 .103.2.1 父类 Drawings .103.2.2 子类(只列出部分)104 设计中的难点.124.1 多态与动态绑定124.2 重绘的理解124.3 文件的新建、打开和保存125 运行测试.136 总结.15参考文献.16模拟画图11 课题介绍1.1 课程设计目的课程设计题目:模拟画图要求设计一个程序,模拟 Windows 中的画图程序,实现图形图像的编辑,修改,保存等功能。1.2 课程设计要求(1)程序中必须包括“新建” 、 “打开” 、 “保存” ,用户可以选择,实现对文件的操作;(2) 画图板的绘图按钮用来画出不同的图形,包括实心图形和空心的图形;(3)可以对线条的颜色和粗细进行设置,也可以对填充图形的颜色进行设置和更改。1.3 课程设计主要知识点(1) 框架类 DrawGraphic 继承了 Swing 类库中 JFrame,并且用到JButton,JLabel,JPanel,等 Swing 类库中的组件进行窗体设计;(2)选择一个文件,用到组件 JFileChooser;(3)选择颜色,用到组件 JColorChooser;(4)弹出标准对话框,用到组件 JOptionPane;(5)在单击绘图按钮时,所触发的动作通过方法 addActionListener 和ActionListener 接口的 actionPerformed 方法共同实现;(6)MouseAdapter 和 MouseMotionAdapter 用来完成鼠标各种事件的相应操作,包括单击、移动、拖拽等;(7)在界面设计的时候结合 BorderLayout 和 GridLayout 两种布局格式;(8)在添加监听器的时候有用到内部匿名类和内部类,所以要熟悉它们的构造方法和使用方法,从中体会持有对方引用的这一设计思想。(9)在图形绘制的时候,用到 Graphics 类,其揭示了所有图形系统几乎都采用的一种机制,就是如何在窗口上画出一些图形来,当窗口构造出来的时候里面有一支画笔,即 Graphics 的一个对象,当窗口调用 paint 方法的时候,系统会把画笔自动传递给它,拿到画笔,重写 paint 方法就实现了在窗口上绘制基本图形。模拟画图22 总体设计2.1 画板界面设计图定义框架类 DrawGraphic,然后在框架上直接添加菜单栏,整个框架采用 BorderLayout 的布局格式。工具栏、显示鼠标位置的标签、主要的画图区域分别在框架的 west,south,center 三块区域。而浮动式工具栏采用的是GridLayout 布局格式,其初始方向设定为 VERTICAL,如下图所示:菜单栏文件帮助工 具 栏打开保存新建用户向导关于画图区域鼠标位置显示标签铅笔直线椭圆矩形颜色粗细橡皮擦文字圆2.2 模块概述2.2.1 文件操作文件的新建,打开,保存可以添加内部匿名类的方式实现,new 一个事件监听器 ActionListener,里面调用 actionPerformed 的方法,被监听的按钮一旦被触发就调用函数执行相应的操作。2.2.2 图形绘制在工具栏里面实现了基本图形的绘制,图形属性的设置,如画笔粗细和画笔颜色的设置,以及橡皮擦,文字输入等功能,而这些功能的实现都是通过添模拟画图3加内部事件监听器类来实现的。一个类用来监听绘制基本图形以及橡皮擦按钮;另一个类用来监听的是选择颜色按钮、选择画笔粗细按钮、和输入文字按钮,里面都用 if 语句和 e.getSource 来判断事件源,从而在触发时,调用不同的函数,当事件源为输入文字时,用 JOptionPane.showMessageDialog 来弹出一个提示操作的对话框。画图区域的功能主要是通过添加鼠标监听器来实现的:一个鼠标监听器监听的是:单击鼠标,释放鼠标,鼠标进入绘图区域,鼠标离开绘图区域这四个鼠标的动作事件;另一个监听的是:鼠标拖拽和鼠标移动。而且,两个监听器之间是存在着密不可分的关系的,它们同时监听画图区域。铅笔作画和橡皮擦的使用是画图板设计的核心也是难点,而且两者的实现原理是一样的,我们通常画图的时候,一定是先单击鼠标然后拖拽鼠标最后释放鼠标的,所以,在画图的过程中,只要鼠标单击一下就获得(x1,y1) ,紧接着用 if 语句判断画的基本图形是哪一个,如果是铅笔或者橡皮擦,则获得(x2,y2) ,说明在铅笔或橡皮擦的时候,鼠标单击一下,就获得一个点,x1=x2,y1=y2,且这个点的坐标就是鼠标单击的位置,而且这个点是算作第一个基本图形的,此时 index=1;拖拽的过程中动态获得鼠标所在位置的横纵坐标且始终 x1=x2,y1=y2,并且等于第一个基本图形也就是 index=1 的那个点的x2,y2,即,在铅笔作画的过程中,在鼠标不断拖拽的过程中,index=1 时的那个点在以点的点的长度不断增加,这就是铅笔作画过程的实现;鼠标释放的时候,在铅笔或橡皮的状态下,也是得到一个点。所以,可以总结,铅笔和橡皮都是通过设置画直线方法中的点的坐标相等来实现的。其它图形的绘制,可以直接调用 Graphics2D 中的方法实现,相对比较简单。模拟画图43 详细设计与实现3.1 框架类 DrawGraphic3.1.1 菜单菜单栏有两个按钮“画图板” 、 “帮助” ,通过添加内部匿名类来实现,一旦下拉菜单中的“新建” 、 “打开” 、 “保存” 、 “退出”四个键被触发,就调用相关的函数,具体代码如下:(1) “新建”执行时,调用的函数代码如下:public void newFile()index = 0;currentChoice = 3;color = Color.BLUE;stroke = 1.0f;createNewItem();repaint();(2) “打开”执行时,调用的函数代码如下:public void openFile()JFileChooser fileChooser = new JFileChooser();/为用户选择文件提供了一种简单的机制 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);int result = fileChooser.showOpenDialog(this);/弹出一个 “Open File“ 文件选择器对话框,父组件 if(result = JFileChooser.CANCEL_OPTION) return;File fileName = fileChooser.getSelectedFile();fileName.canRead();/测试应用程序是否可以读取此抽象路径名表示的文件 if(fileName = null|fileName.getName().equals(“)JOptionPane.showMessageDialog(fileChooser, “这个名字不可以用的“,“ “, JOptionPane.ERROR_MESSAGE);elsetryFileInputStream fis = new FileInputStream(fileName);input = new ObjectInputStream(fis);int countNumber=0;countNumber = input.readInt();for(index=0;indexcountNumber;index+)Drawings inputRecord = (Drawings)input.readObject();itemListindex = inputRecord;模拟画图5createNewItem();input.close();repaint();catch(EOFException endofFileException)/当输入过程中意外到达文件或流的末尾时,抛出此异常 JOptionPane.showMessageDialog(this, “no more record in file“,“end of file“,JOptionPane.ERROR_MESSAGE);catch(ClassNotFoundException classNotFoundException)JOptionPane.showMessageDialog(this, “unable to create object“,“class not found“,JOptionPane.ERROR_MESSAGE);catch(IOException ioException)JOptionPane.showMessageDialog(this, “error during read from file“,“read error“,JOptionPane.ERROR_MESSAGE);(3) “保存”执行时,调用的代码如下:public void saveFile()JFileChooser fileChooser = new JFileChooser();fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);/允许用户只选择文件int result = fileChooser.showSaveDialog(this);/弹出一个 “Save File“ 文件选择器对话框 if(result = JFileChooser.CANCEL_OPTION) return;File fileName = fileChooser.getSelectedFile();fileName.canWrite();if(fileName = null|fileName.getName().equals(“)JOptionPane.showMessageDialog(fileChooser, “这个名字不可以用的“,“ “,JOptionPane.ERROR_MESSAGE); elsetryfileName.delete();FileOutputStream fos = new FileOutputStream(fileName);output = new ObjectOutputStream(fos);output.writeInt(index);/写入一个32位的int值 for(int i= 0;iindex;i+)Drawings outputRecord = itemListi;output.writeObject(outputRecord);/将指定的对象写入 ObjectOutputStream模拟画图6output.flush();/此操作将写入所有已缓冲的输出字节,并将它们刷新到底层流中 output.close();fos.close();catch(IOException ioe)ioe.printStackTrace();3.1.2 工具栏工具栏按钮功能的实现,是通过添加两个内部事件监听类ButtonHandler1、ButtonHandler2 来达到目的的。(1)ButtonHandler1 监听绘制基本图形的按钮,if 语句判断事件源,具体代码如下:public class ButtonHandler1 implements ActionListenerpublic void actionPerformed(ActionEvent e)for(int
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号