《Java语言》课程期末作业题目第1题:简易绘图程序学院计算机学院专业软件工程班别学号姓名2015年12月6日翁佳盛——《Java语言》课程期末作业2一、课程题目绘图应用程序。利用学过的GUI方法实现一个较为完整的绘图应用程序。用户可以选择要画的图形(如线,椭圆,圆,矩形,弧,圆角矩形,多边形,折线等等),选择画笔颜色和画笔粗度,用鼠标单击和拖拽等动作绘图,并能将绘图结果保存为jpg和bmp格式。二、题目分析与设计1.开发环境:Eclipse4.5.0JDK1.8.0_452.题目需求分析:题目要求实现一个较为完整的绘图程序,最基本的要求是用户可以自由选择图形,颜色,线条粗细等属性,并用鼠标绘制图形,并将其保存为图片文件。首先,程序界面参考一般绘图软件,进行组件的布局。另外对于程序的功能实现,则将图形封装成类,通过多态实现多种不同图形的绘制,并用输入输出流保存或打开文件。除此之外根据实际操作的需要,添加一些必要或者实用的功能,如撤销操作,快捷键撤销或保存,关闭文件前弹窗提示保存等功能。(1).菜单功能:通过菜单栏进行:一、文件的读取与写入;二、使用扩展功能;三、程序的简单偏好设置;四、程序信息提示。(2).绘图功能:在绘图过程通过工具栏进行形状、颜色等图形选择,在文本输入及扩展功能状态下会新增子工具栏,在子工具栏中对于字体或其它形状进行设置。然后在画板区域通过鼠标的点击与拖拽绘制图形。绘图过程应有保存与撤销功能。绘图范围为画板的显示的区域。翁佳盛——《Java语言》课程期末作业3(3).其它功能:如快捷键Ctrl+z为撤销,Ctrl+s为保存。鼠标停在工具栏按钮上时提示功能。文件修改后窗口标题带上星号作为标记。第一次编辑的文件或修改过的文件关闭前自动提示保存。等等。(4).功能架构图:3.界面设计:本程序使用Swing图形编程。菜单:类似于常见程序,添加子菜单:File,Paint,Setting,Help。在File菜单下有new,open,save,exit等菜单项。Paint下主要是moreshape调出更多图形选择,Setting下的background菜单项可更改画板背景颜色。Help下可查看程序及作者的信息。主界面:采用默认的BordeLayout布局,添加工具栏于NORTH区,画板于CENTER区。打开程序时默认全屏。工具栏:由于有多个工具栏,所以使用JTabbedPane做出多标签。主工具栏一直存在,文本工具栏和扩展工具栏每次最多只有一个出现,若打开时另一个工具栏已存在,则会先将已存在的工具栏关闭。主工具栏与文本工具栏由于有复选框这一组件,添加后会自动填满多余空间,所以使用FlowLayout布局。扩展工具栏使用默认布局。主工具栏添加常用图形按钮、图形属性按钮、撤销按钮。文本工具栏添加字简易绘图文件操作绘画图形补充功能打开文件新建文件保存文件撤销擦除图形绘制背景颜色更多图形作者信息翁佳盛——《Java语言》课程期末作业4体属性按钮,撤销按钮及退出文本工具栏按钮。扩展工具栏添加多边形按钮及退出扩展工具栏按钮。每个工具栏的按钮各自存放在一个ArrayList中。画板:画板类从JPanel继承,重写paintComponent方法,使得画板每次刷新时可将之前的所有图形重新画出来。4.逻辑实现:画图部分:程序将一个图形的所有信息封装为一个Drawings类,而具体的图形则从Drawings类继承,并实现自己的draw()方法用以画出图形。因此,可以创建一个Drawings类型的数组,用一个索引对数组进行操作,用户每画一个图形,就将该图形的所有信息存放到数组中索引指向的位置,索引向后移动一位。重写后的画板的drawComponent方法就会自动将数组中从0位置到索引位置的所有图形在画板上绘制出来。而撤销操作只需要将索引向前移动一位并重画即可。文件读写:保存文件时,先创建一个BufferedImage对象,然后将画板内容画到该对象上,并将该对象写入到指定文件中。打开文件时,则从指定文件中获得一个BufferedImage对象,将其作为一个从Drawings类继承的图形,在画板上画出来。三、测试分析1.测试数据:(1).新建文件,画图,保存为jpg文件;(2).新建文件,画图,保存为bmp文件;(3).打开(1)(2)中保存的文件;(4).打开一个txt文件,弹窗报错;2.测试情况:测试结果与预计结果一致;翁佳盛——《Java语言》课程期末作业5翁佳盛——《Java语言》课程期末作业6翁佳盛——《Java语言》课程期末作业7翁佳盛——《Java语言》课程期末作业8附录:源代码+图标importjava.awt.AWTEvent;importjava.awt.BasicStroke;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Cursor;importjava.awt.Dimension;importjava.awt.FlowLayout;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.Toolkit;importjava.awt.event.AWTEventListener;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.ItemEvent;importjava.awt.event.ItemListener;importjava.awt.event.KeyEvent;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.awt.event.MouseMotionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjava.io.Serializable;importjava.util.ArrayList;importjavax.imageio.ImageIO;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JColorChooser;importjavax.swing.JComboBox;importjavax.swing.JComponent;importjavax.swing.JFileChooser;importjavax.swing.JFrame;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;翁佳盛——《Java语言》课程期末作业9importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JTabbedPane;importjavax.swing.JToggleButton;importjavax.swing.JToolBar;importjavax.swing.filechooser.FileFilter;publicclassMiniDrawPadextendsJFrameimplementsMouseListener,MouseMotionListener{//基本属性定义MainMenumainMenu;//主菜单JTabbedPanetab;//多工具栏ToolBartoolBar;//主工具栏ArrayListJButtonbutton;//主工具栏的一排按钮String[]names={//主工具栏按钮名pencil,line,oval,rect,orect,tria,eraser,word,color,full,undo};JComboBoxstrokeitem;//线条粗细选择框DrawPanelboard;//画图面板FilefileName=null;//打开保存的文件名StringoldName;//原窗口名标记Drawings[]pic=newDrawings[5000];//图形单元存储数组intindex=0;//当前图形存储位置intshape=0;//形状标记intstroke=1;//线条粗细标记intlengthCount;//铅笔或橡皮擦图形的存储长度intbold,italic;//粗体与斜体intsize=3;//文字大小Stringfont;//文字字体Colorcolor=Color.black;//颜色标记Coloranticolor=Color.white;booleanfill=false;//填充标记inttag=0;//标记文件第一次打开//构造主面板publicMiniDrawPad(Strings){super(s);oldName=s;tab=newJTabbedPane();board=newDrawPanel();mainMenu=newMainMenu();toolBar=newToolBar();翁佳盛——《Java语言》课程期末作业10board.setPreferredSize(newDimension(Toolkit.getDefaultToolkit().getScreenSize()));board.addMouseListener(this);board.addMouseMotionListener(this);this.setJMenuBar(mainMenu);tab.add(主工具栏,toolBar);this.add(tab,BorderLayout.NORTH);this.getContentPane().add(board,BorderLayout.CENTER);this.setExtendedState(JFrame.MAXIMIZED_BOTH);this.setBounds(350,35,555,655);this.setVisible(true);initItem();//初始化当前图形单元this.addWindowListener(newWindowAdapter(){@OverridepublicvoidwindowClosing(WindowEvente){//TODOAuto-generatedmethodstubif(getTitle().equals(oldName+*)){//关闭前确定保存Object[]options={确定,取消};intchoice=JOptionPane.showOptionDialog(JOptionPane.getFrameForComponent(board),文件未保存,是否保存?,提示,JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null,options,options[0]);if(choice==0)mainMenu.saveFile();}System.exit(0);}});//注册全局监听Toolkittk=Toolkit.getDefaultToolkit();tk.addAWTEventListener(newImplAWTEventListener(),AWTEvent.KEY_EVENT_MASK);}//自定义键盘监听器classImplAWTEventListen