Java课程设计画图板软件开发和设计.doc
华 北 科 技 学 院课程设计说明书班级: 信息与计算科学B091 学号: 200909014117 姓名:_田健 _设计题目:_画图板软件开发和设计_设计时间:_2011.12.26_至_2011.12.31 _ 指导教师:_李芙玲_评 语:_评阅成绩: 评阅教师: 目录1 引 言11.1课程设计选题11.2课程设计的目的11.3本选题的设计背景12 需求分析12.1 功能需求12.2 系统的开发运行环境23 总体设计23.1 系统体系结构设计23.2系统功能模块及主要类设计34详细设计与实现44.1 绘图主界面模块44.2保存打开模块55小结和展望5参 考 文 献6附 录7使用说明书7源程序清单71 引 言1.1课程设计选题画图板软件开发和设计该画图板在图形界面下可以画椭圆,正圆,矩形,正方形,填充颜色,添加字符等基本功能。1.2课程设计的目的巩固和加深以Java 语言为基础的面向对象编程技术理论知识的理解,提高实际动手编程能力的培养,掌握以Java为核心的应用软件开发方案,达到能独立阅读、编制和调试一定规模的Java程序的水平, 程序通过调用JAVA提供的基本类进行了简单的界面设计,运用了JAVA中类的继承特性实现了对父类方法的调用,并多次使用CASE语句实现绘图菜单的选择,运用了适配器类简化了监听器类的重写工作。1.3本选题的设计背景在现实生活中,我们会经常遇到些需要绘制简单图形的问题,但是网络上大多数的绘图工具都比较复杂,所以我们需要一些简单实用的绘图小工具,以便对工作带来最大的满足与需求,于是我就设计了一个简单的绘图小工具,虽然不很常熟但是我觉得还挺实用的。2 需求分析2.1 功能需求设计一个画图工具,能够实现画图工具、画直线、画椭圆、画多边形等功能,并且在绘图的过程中能够修改该画笔的大小以及颜色。该画图程序还需具有橡皮擦功能。1、这个画图程序,最基本的功能是,作为一个画图工具利用它实现在屏幕上任意绘画、书写的功能;2、利用这个画图程序,通过选择画直线、画箭头、画多边形、画矩形、椭圆、圆形等功能选项并且在屏幕上拖动鼠标操作能实现画出相应图形的功能;3、这个画图程序,还需具备橡皮擦的功能,利用这个橡皮擦能够擦除屏幕上的图案,并且此橡皮擦也应该能够改变大小;4、这个画图程序,还应该做到能够改变画笔颜色的功能;5、这个画图程序,还应该具备能够清除整个屏幕已绘制图画的功能。2.2 系统的开发运行环境本系统集成开发环境:MyEclipse本系统运行环境: windows xp 或以上版本MyEclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。编写代码和运行软件都很方便。编写过程中要是有错误就有提示,非常方便用户修改代码。3 总体设计3.1 系统体系结构设计本程序主体为一个文件:MiniDrawPad.java。其中包括的程序段有: MiniDrawPad():构造函数,用以初始化。 chooseColor():选择当前绘图颜色程序段。 setStroke():设置当前画笔粗细程序段。 loadFile():调用图形文件程序段。 newFile():新建一个图形文件程序段。 saveFile():保存当前所绘制图形程序段。 creatNewItem():新建一个基本图形单元程序段。相应的内部类有: ButtonHandler:用来处理基本图形单元的按钮事件。 ButtonHandler1:用来处理颜色、画壁粗细、文字输入三个操作按钮的按钮事件。 DrawPanel:用来创建绘图区域的子类。 MouseA:继承了MouseAdapter,用来完成鼠标相应事件的操作,如单击、松开、进入和离开等。 MouseB:继承MouseMotionAdapter,用来完成鼠标拖动和鼠标移动的相应事件操作。此外,还继承了父类drawings的基本图形子类,如前所述,这里不再重复。3.2系统功能模块及主要类设计画板主要由以下几个部分组成:3.2.1主窗体的设计。主类(MiniDrawPad)用来生成主界面,完成画图板的主要框架。主类由JFrame派生出来。主界面由菜单栏、工具栏和画图区域三部分组成,布局格式采用BorderLayout布局形式。3.2.2菜单栏和工具栏的设计。菜单栏包括文件菜单栏、颜色菜单栏、线条粗细菜单栏和提示菜单栏。其中文件菜单栏包括文件的新建、打开、保存等选项;颜色菜单栏可以进行颜色选择;线条粗细菜单栏设置线条的粗细;提示菜单栏给出提示信息。工具栏由新建、打开和保存文件按钮、基本图形的按钮、选择字体风格复选框和字体下拉列表框组成。在主类中添加并对菜单栏和工具栏添加事件监听。3.2.3事件响应的处理。对菜单栏、工具栏和用鼠标画图的事件响应进行处理。(1)菜单栏中文件的新建、打开和保存菜单事件的处理:Java把每个文件都视作顺序字节流。如果要在Java中进行文件处理,则必须用到Java.io包。这个包定义了一些流类,选用FileInputStream(从文件中读入数据)和FIleOutputStream(向文件输出数据),通过建立这些文件的对象便可以打开文件。这些流相应地从InputStream和OutputStream派生,这些文件均使用文件流,所以必须将文件结构化以适应程序的要求。我们需要对保存的对象序列化,然后以输出流的方式保存。在程序中用newFile()、loadFile()和saveFile()三个函数分别实现文件的新建、打开和保存。(2)工具栏事件的处理:主要有一些Button组成。我们用ButtonHandler内部类处理基本单元事件,ButtonHandler1内部类处理新建、打开和保存文件按钮,在画图类DrawPanel中定义CreateNewItem()函数处理工具栏中的画图事件。(3)鼠标画图:由于画图板主要是用来画图,所以需要在程序中添加对鼠标按下、拖动、进入、退出、移动和单机事件进行监听并进行处理。内部类mouseA定义了完成鼠标按下、松开、进入、退出事件响应。内部类mouseB完成鼠标拖动和移动事件响应。4详细设计与实现4.1 绘图主界面模块4.1.1.功能设计在程序设计中用到了动态绑定,我们可以提取他们的公共属性,先建立一个父类,然后建立各个子类,继承父类中的方法并将父类中的draw函数重写。一些关于图形形状的类,最主要是用于画图、字体和橡皮擦等基本类型。如Circle、Triangle、Rectangle,它们都是有超类(Object类)派生的。在面向对象编程中,每个类都有画出自己的能力,每个类都有自己的draw函数,但每种形状的draw函数都不一样,但在绘制任何形状时,只需简单调用父类drawing的draw方法,然后让程序动态地根据对象的类型决定使用哪个子类的draw方法。为了使画出的图形更加美观,我们在draw函数中使用了Graphics2D的对象的引用。这样可以在不改变原程序的情况下,添加扩展的图形,是程序变得更加强大。同时,为了文件的保存,父类实现Serialize接口,将对象线性化。4.1.2.界面设计我们可以看到,整个程序界面很简洁,而且界面操作、提示内容全部是中文,一目了然。在左上方的菜单栏里有文件、颜色、线条粗细、帮助4个下拉式菜单,可以对绘图文件进行相应的操作。下面一排是工具栏的工具按钮,从左到右依次为:新建文件、打开文件、保存文件、随笔画、直线、空心矩形、实心矩形、空心椭圆、空心圆、实心圆、空心圆角矩形、实心圆角矩形、橡皮擦、颜色选择按钮、线条粗细设置按钮、文字添加按钮、粗体字体选择框、斜体字体选择框、字体选择下拉式选择框。整个工具栏是可以拖动的,可以将它拖动到程序窗口的任意位置。工具栏下面的整个白色区域就是绘图区域,即绘图面板,它的大小可以随着窗口的大小自动调整。在窗口的最底部是程序设计作者标注,以及鼠标状态提示条,可以显示当前的鼠标状态,包括进出窗口、移动、单击、松开等。具体效果如下列图所示:4.1.3模块算法(或重要代码段):见附录4.1.4调试与测试 测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施。4.2保存打开模块图2打开保存界面5小结和展望作为一名大三的学生,我觉得能做类似的课程设计是十分有意义,而且是十分必要的。在已度过的大三的时间里我们大多数接触的是专业基础课。我们在课堂上掌握的仅仅是专业基础课的理论面,如何去锻炼我们的实践面?如何把我们所学到的专业基础理论知识用到实践中去呢?我想做类似的大作业就为我们提供了良好的实践平台。在做本次课程设计的过程中,我感触最深的当数查阅大量的书籍了。为了让自己的设计更加完善,更加符合软件工程标准,一次次翻阅各种参考资料是十分必要的,同时也是必不可少的。我们是在作设计,但我们不是艺术家。他们可以抛开实际,尽情在幻想的世界里翱翔,我们是软件设计师,一切都要有据可依.有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。作为一名学生掌握一门或几门程序设计语言是必不可少的,由于本次课程设计要求用java进行开发,在这过程中我对各种的开发环境进行了探索,其中有vb.c+等,这使我对java的集成开发环境有了更深刻的理解虽然去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率好高,记得大一学c语言好难就是因为我们没有把自己放在使用者的角度,单单是为了学而学,这样效率当然不会高。边学边用这样才会提高效率,这是我作本次课程设计的第二大收获。但是由于水平有限,难免会有错误,还望老师批评指正。参 考 文 献1 耿祥义, 张跃平. Java实用教程M 北京:电子工业出版社, 2011.2 陈明. Java语言程序设计课程实践, 北京: 清华大学出版社, 20093 唐小军等.java项目设计与开发范例,电子工业出版社,2005年4附 录使用说明书1.绘制基本图形基本图形包括以下几种:Pencil:随笔画,图标为:。Line:直线,图标为:。Rect:矩形,图标为:。FRect:实心矩形,图标为:。Oval:椭圆,图标为:。FOval:实心椭圆,图标为:。Circle:圆,图标为:。FCircle:实心圆,图标为:。RoundRect:圆角矩形,图标为:。FrRect:实心圆角矩形,图标为:。Rubber:橡皮擦,图标为:。源程序清单import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;public class MiniDrawPad extends JFrame /主类,扩展了JFrame类,用来生成主界面 private ObjectInputStream input; private ObjectOutputStream output; /定义输入输出流,用来调用和保存图像文件 private JLabel statusBar; /显示鼠标状态的提示条 private DrawPanel drawingArea; /画图区域 private int width = 850, height = 600; /定义画图区域初始大小 drawings itemList = new drawings5000; /用来存放基本图形的数组 private JButton choices; /按钮数组,存放以下名称的功能按钮 JToolBar buttonPanel; /定义按钮面板 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; /定义字体风格选择框 JComboBox styles; 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 = "新建", "打开", "保存", "铅笔画", "直线", "空心矩形", "填充矩形", "空心椭圆", "填充椭圆", "空心圆形", "填充圆形", "空心圆角矩形", "填充圆角矩形", "橡皮擦", "颜色", "线条", "输入文本" ; public MiniDrawPad() /构造函数 super("绘图板 姓名:田健 学号:200909014117"); JMenuBar bar = new JMenuBar(); JMenu fileMenu = new JMenu("文件(F)"); fileMenu.setMnemonic('F'); /新建文件菜单项 JMenuItem newItem = new JMenuItem("新建-N"); newItem.setMnemonic('N'); newItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_N, InputEvent.CTRL_MASK); newItem.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) newFile(); /如果被触发,则调用新建文件函数段 ); fileMenu.add(newItem); /保存文件菜单项 JMenuItem saveItem = new JMenuItem("保存-S"); saveItem.setMnemonic('S'); saveItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_S, InputEvent.CTRL_MASK); saveItem.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) saveFile(); /如果被触发,则调用保存文件函数段 ); fileMenu.add(saveItem); /打开文件菜单项 JMenuItem openItem = new JMenuItem("打开-L"); openItem.setMnemonic('L'); openItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_L, InputEvent.CTRL_MASK); openItem.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) openFile(); /如果被触发,则调用打开文件函数段 ); fileMenu.add(openItem); fileMenu.addSeparator(); /退出菜单项 JMenuItem exitItem = new JMenuItem("退出-X"); exitItem.setMnemonic('X'); exitItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_X, InputEvent.CTRL_MASK); exitItem.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0); /如果被触发,则退出画图板程序 ); fileMenu.add(exitItem); bar.add(fileMenu); /设置、颜色菜单项 JMenu setMenu = new JMenu("设置(E)"); setMenu.setMnemonic('E'); JMenuItem colorItem = new JMenuItem("颜色-O"); colorItem.setMnemonic('O'); colorItem.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) chooseColor(); /如果被触发,则调用选择颜色函数段 ); setMenu.add(colorItem); bar.add(setMenu); /线条菜单 JMenuItem strokeItem = new JMenuItem("线条-K"); strokeItem.setMnemonic('K'); strokeItem.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) setStroke(); ); setMenu.add(strokeItem); bar.add(setMenu); /帮助 JMenu helpMenu = new JMenu("帮助(H)"); helpMenu.setMnemonic('H'); JMenuItem aboutItem = new JMenuItem("请联系我 "); aboutItem.setMnemonic('A'); aboutItem.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(null, "华北科技学院基础部 n田健n n学号:200909014117n电话:15930669490n ", "帮助", JOptionPane.INFORMATION_MESSAGE); ); helpMenu.add(aboutItem); bar.add(helpMenu); items = new ImageIconnames.length; /创建各种基本图形的按钮 drawingArea = new DrawPanel(); choices = new JButtonnames.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+) itemsi = new ImageIcon(namesi + ".gif"); choicesi = new JButton("", itemsi); choicesi.setToolTipText(tipTexti); choicesi.setPreferredSize(new Dimension(33, 33); buttonPanel.add(choicesi); /将动作侦听器加入按钮里面 for (int i = 3; i < choices.length - 3; i+) choicesi.addActionListener(handler); choices0.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) newFile(); ); choices1.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) openFile(); ); choices2.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) saveFile(); ); choiceschoices.length - 3.addActionListener(handler1); choiceschoices.length - 2.addActionListener(handler1); choiceschoices.length - 1.addActionListener(handler1); /字体风格选择 styles = new JComboBox(styleNames); styles.setMaximumRowCount(8); styles.addItemListener( new ItemListener() public void itemStateChanged(ItemEvent e) style1 = styleNamesstyles.getSelectedIndex(); ); /字体选择 bold = new JCheckBox("粗体"); italic = new JCheckBox("斜体"); 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(" 欢迎进入我的绘图板界面! :)"); 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() = choicesj) currentChoice = j; createNewItem(); repaint(); /按钮侦听器ButtonHanler1类,用来侦听颜色选择、画笔粗细设置、文字输入按钮的操作 public class ButtonHandler1 implements ActionListener public void actionPerformed(ActionEvent e) if (e.getSource() = choiceschoices.length - 3) chooseColor(); if (e.getSource() = choiceschoices.length - 2) setStroke(); if (e.getSource() = choiceschoices.length - 1) JOptionPane.showMessageDialog(null, "请点击绘图板选择文本输入位置", "提示", JOptionPane.INFORMATION_MESSAGE); currentChoice = 14; createNewItem(); repaint(); /鼠标事件mouseA类,继承了MouseAdapter,用来完成鼠标相应事件操作 class mouseA extends MouseAdapter public void mousePressed(MouseEvent e) statusBar.setText(" Mouse Pressed