下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计-JAVA-画板■模拟画图工具作者:日期:17171课题介绍1.1课程设计目的 1.2课程设计要求 1.3课程设计主要知识点2总体设计2.1画板界面设计图2.2模块概述2.2.1 文件操作2.2.2图形绘制3详细设计与实现3.1框架类DrawGraphic3.1.1菜单 3.1.2工具栏....3.1.3画图区域.113.2基本图形类113.2.1父类Drawings 3.2.2子类(只列出部分)4设计中的难点 1111134.1多态与动态绑定4.2重绘的理解.....13134.3文件的新建、打开和保存135运行测试6总结.......参考文献...14161.1课程设计目的1课题介绍改,1.改,1.2课程设计要求课程设计题目:模拟画图要求设计一个程序,模拟WindOWS中的画图程序,实现图形图像的编辑,修保存等功能。程序中必须包括“新建”、“打开”、“保存”,用户可以选择,实现对文件的操作;画图板的绘图按钮用来画出不同的图形,包括实心图形和空心的图形;也可以对填充图形的颜色进行设置(3)可以对线条的颜色和粗细进行设置,和更改。也可以对填充图形的颜色进行设置Swing类库中JFrame,并且用到Swing类库中JFrame,并且用到g类库中的组件进行窗体设计;框架类DrawGraphic继承了JButton,JLabel,JPanel,等Swin选择一个文件,用到组件J;选择颜色,用到组件JColorChooser;⑷弹出标准对话框,用到组件JOptionPane;(5)在单击绘图按钮时,所触发的动作通过方法 addActionListener和ActionListener接口的actionPerformed方法共同实现;(6)MouseAdapter和MouseMotionAdapter用来完成鼠标各种事件的相应操作,包括单击、移动、拖拽等;在界面设计的时候结合BorderLayout和GridLayout两种布局格式;在添加监听器的时候有用到内部匿名类和内部类 ,所以要熟悉它们的构造方法和使用方法,从中体会持有对方引用的这一设计思想。在图形绘制的时候,用到Graphics类,其揭示了所有图形系统几乎都采用的一种机制,就是如何在窗口上画出一些图形来,当窗口构造出来的时候里面有一支画笔,即Graphics的一个对象,当窗口调用paint方法的时候,系统会把画笔自动传递给它,拿到画笔,重写paint方法就实现了在窗口上绘制基本图形。^-―•——--L2总体设计2.1画板界面设计图定义框架类DrawGraphie,然后在框架上直接添加菜单栏,整个框架采用BorderLayout的布局格式。工具栏、显示鼠标位置的标签、主要的画图区域分别在框架的west,south,center三块区域。而浮动式工具栏采用的是GridLayout布局格式,其初始方向设定为VERTICAL,如下图所示:新建1打开1保存1用户向导 1关于1*-h-+A1文件帮助441菜单栏画图区域椭圆[4—画图区域矩形*颜色 H=鼠标位置显示标签2模块概述2.2.1文件操作文件的新建,打开,保存可以添加内部匿名类的方式实现,new一个事件监听器ActionListener,里面调用actionPerformed的方法,被监听的按钮一旦被触发就调用函数执行相应的操作。2.2.2图形绘制在工具栏里面实现了基本图形的绘制,图形属性的设置,如画笔粗细和画笔颜色的设置,以及橡皮擦,文字输入等功能,而这些功能的实现都是通过添加内
部事件监听器类来实现的。一个类用来监听绘制基本图形以及橡皮擦按钮 ;另一个类用来监听的是选择颜色按钮、选择画笔粗细按钮、和输入文字按钮,里面都用if语句和e.getSource来判断事件源,从而在触发时,调用不同的函数,当事件源为输入文字时,用JOptionPane.showMessageDialog来弹出一个提示操作的对话框。画图区域的功能主要是通过添加鼠标监听器来实现的 :一个鼠标监听器监听的是:单击鼠标,释放鼠标,鼠标进入绘图区域 ,鼠标离开绘图区域这四个鼠标的动作事件;另一个监听的是:鼠标拖拽和鼠标移动。而且,两个监听器之间是存在着密不可分的关系的,它们同时监听画图区域。铅笔作画和橡皮擦的使用是画图板设计的核心也是难点 ,而且两者的实现原而且这个点是算作第一个基本图形的,此时inx1=x2,y1=y2,ndex=1的那个点的x2,y2,即,在铅笔作画,index=1时的那个点在以点的点的长度不;鼠标释放的时候,在铅笔或橡皮的状态下,铅笔和橡皮都是通过设置画直线方法中的点,可以直接调用Graphics2D中的方法实理是一样的,而且这个点是算作第一个基本图形的,此时inx1=x2,y1=y2,ndex=1的那个点的x2,y2,即,在铅笔作画,index=1时的那个点在以点的点的长度不;鼠标释放的时候,在铅笔或橡皮的状态下,铅笔和橡皮都是通过设置画直线方法中的点,可以直接调用Graphics2D中的方法实dex=1;拖拽的过程中动态获得鼠标所在位置的横纵坐标且始终并且等于第一个基本图形也就是i的过程中,在鼠标不断拖拽的过程中断增加,这就是铅笔作画过程的实现也是得到一个点。所以,可以总结,的坐标相等来实现的。其它图形的绘制现,相对比较简单。3详细设计与实现3.1框架类DrawGraphic3.1.1菜单菜单栏有两个按钮“画图板”、“帮助”,通过添加内部匿名类来实现,一旦下拉菜单中的“新建”、“打开”、“保存”、“退出”四个键被触发,就调用相关的函数,具体代码如下:(1)“新建”执行时,调用的函数代码如下publicvoidnewFile(){index= 0;?currentChoice=3;?color=Col0r?color=Col0r.BLUE;stroke=1.createNeOf;wItem();?repaint();?}2)“打开”执行时,调用的函数代码如下:?publicVoid?publicVoidopenFileewJ();//(){为用户选择文件提供了一种简单的机制(J.);result=(this);//弹岀一个"OpenFile"文件选择器对话框,父组件?ifJ.CANCEL—OP?ifJ.CANCEL—OPTION)return??();(resule=();//测试应用程序是否可以读取此抽象路径名表示的文件?if(==nullIlO.equa Is("")){?i?JOptionPane.showMessageDialog(,"这个名字不可以用的",""?J?JOptionPan e.ERROR_MESSAGE);??}else??}else{try{fisnew();???input=?intectinp???input=?intectinpcountNumbernewObjutStream(fis);?countNumber=in=0;put.readint();for(ifor(index=0;index<coun?DrawingsinputRecord=(DrtNumber;index++){awings)input.readObject();??itemList[it();??itemList[index]=inputRecord;????createNewItem();input.close();repaint();eptionendof){?? }catch(EOFExc时,抛岀此异常//当输入过程中意外到达文件或流的末尾? ?JO??createNewItem();input.close();repaint();eptionendof){?? }catch(EOFExc时,抛岀此异常//当输入过程中意外到达文件或流的末尾? ?JOptionPanfile",e.showMessageDial0g(this"nomorerecordin??"endof??}catch(ClassJOptionPobject",?????JOptifromfile"???}?});NotFoundEXceptiane.showMessageclassnotfouch(IOException}catonPane.showMessageDonclassDialog(thisNotFoundExcept"unabletone.ERRORMESion){createSAGE);d",JOptionPaoException){alog(this,"errorduringread???"readerror",JOptionPane.ERROR_MESSAGE);blicvoidsaveFile(){=newJ();//允许用户只选择文件???blicvoidsaveFile(){=newJ();//允许用户只选择文件???//此操作将写入所有已缓冲的输岀字节 ,并将它?intreifsult =1(result=(this);//弹岀一个”SaveFi1e"turn;文件选择器对话框=J.CANCE「OPTION)re??Fi1e=();??();if(==nu1l||().equa 1s("”)){?JOptionPane.showMessageDialog(,"这个名字不可以用的“,"“,JOptionPane.ERROR__MESSAGE);??}?else{?try{();???fos=new(:);???output=newObjectOutputStream(fos);???o1utput.writeInt(index);? //写入一个32位的int值?for(inti=0;i<index;i++){??Drawingsoutpu tRecord=itemList:i:;??output.writeObject(outputRecord);?//将指定的对象写入ObjectOutputStreamJ??(J.)?output.flush();们刷新到底层流中????}
? ?output .c1ose();???fos.close();e){ce();???}catch(IOExceptionio??ioe.pe){ce();}3.1.2工具栏工具栏按钮功能的实现,是通过添加两个内部事件监听类B工具栏按钮功能的实现,是通过添加两个内部事件监听类ButtonHandier1、ButtonHandler2来达到目的的。(1)ButtonHandierl监听绘制基本图形的按钮,if语句判断事件源,具体代码如下:pub1iccpub1iccla??pub1ic?for(in?if(e.getSo???currentChossButton Handler1 implementsAct1onListene r{VoidactionPerformed(ActlonEvente){tj=3;j<choices.length-3;j++){urce()==choices[j]){ice=j;?createNewltem();??????repaint()??},具体代码如下:(2)ButtonHand1er2监听颜色选色器、画笔粗细、添加文字按钮,if语句判断事件源,相应的按钮被触发,就执行相应的函数,具体代码如下:tltlonListener{publicc1assButtonHandler2implement sAc?public?if(e.??chooseCoVoidactionPerfgetSour1or();ce()==cormed(ActionEventhoices[cholces.e){length-3]){??}??if(e.getSource()?setStrok==choices[choices.length-2]){??}?ico??if(e.getSource()?setStrok==choices[choices.length-2]){??}?icon=newe();mageIcon(getClass().getResource("/images/sm11e.png"));? if(e.getSour? ?JOptionPan标先点一下那里吧!",? ? " ",JOptionPane.ce()==choices[choicee.showMessageDialog.le(nullINFORMATION_MESSAGE,ngth-1:){,"想在哪里添加文字呢?鼠icon);??currentChoice=14;??}3.???createNewltem();? ?repaint();??}1.3画图区域(1)createNewltem()用来new各种基本图形,在函数的一开始,我设置了一下光标的样子,然后用SWitch函数接收currentChoice来判断用户要new的是哪一个基本图形,关键代码如下voidcreateNewItem(){if(currentChoice14){??}3.???createNewltem();? ?repaint();??}1.3画图区域(1)createNewltem()用来new各种基本图形,在函数的一开始,我设置了一下光标的样子,然后用SWitch函数接收currentChoice来判断用户要new的是哪一个基本图形,关键代码如下voidcreateNewItem(){if(currentChoice14){drawingArea.setCEXT_CURSOR));?}ursor(Cursor.getPredefinedCursor(Cursor.Te1se{drawingArea.sOSSHAIR_CURSOR));etCursor(Cursor.getPredef inedCursor(Cursor.CR??}??switch(currentChoicecase3:itemList[index]case4:itemList[indexnewPencil()]=newLin;break;e();break;();break;ect();break;1();break;st[index] =newfillOval();break;[index]=newCircle()?case10:itemList[index] =11:itemList[index]?case5:itemList??case6:itemL?case7:ite??case8:itemLi??case9:itemListcaseasecase13:case14:??itemLi[indexist[mList]=newRectindex]=newfillR[index]=newOvanewfillnewfnew;break;1Circle。;RoundRect();breakbreak;12: itemList[index] =newfitemList[indexitemList[ind]=newRubbeex]newWorillRoundRect();break;r();break;d();break;index].type[index].R=? itemList[index].G=st[itemListcurrentChoiceR;i temList[index].B = B;troke;?? i temL ist[index].sttroke;(2)chooseColor()用来选择各种颜色,具体代码如下:PublicvoidchooseColor(){?color=JColorChooser.showDialog(null,"在这里选择自己喜欢的颜色",co1or);
?R=colo??G=color??B=cor.getRedO;.getGreen();?R=colo??G=color??B=cor.getRedO;.getGreen();r.getBlue();⑶setStrokeO用来设置画笔粗细,具体代码如下:Public VoidsetStroke(){Stringinput;input=JOpti的粗细值(一个>0的实数)0nPane.","1.0IIstrokeFloat.parseFshowInputDialog(null ,"在这里重新输入画笔);oat(input);II将字符串参数转换为一个itemList[index].stroke=stroke候,用e.(4)mouseA监听鼠标单击、释放、进入、离开四个事件,当鼠标单击的时getS0urce()先得到一个点的坐标初始化(x1,y1),再判断单击的是哪一个按钮,如果是绘制其它图形的按钮,那就光得到一个点(x1,y1);如果候,用e.是铅笔或者橡皮擦,则继续初始化第二个点的坐标(x2,2),此时x1=x2,y1=y2,即鼠标单击绘出一个点,而这个点是用绘直线方式画出的,表示已绘制的图形个数的index++;如果是添加文字按钮,则弹出一个可以输入文字的对话框。当鼠标释放的时候,如果是铅笔或橡皮,同样得到一个点,如果是绘制其它图形的基本按钮,那就光得到(x2,y2),关键代码如下:classmouseAextendsMouseAdapter{publicvoidmousePressed(MouseEvente){statusBar.setText("Mouse Pressed@:["+e.getX()+",+e.getY()+“]”);?itemList[index].x1=e.getX();??itemList[index].y1=e.getY();if(curre?itemntChoice==3 ||currentChoice???itemList[i????index++;List[index].ndex].y2=e.x2=e.gegetY();tX()ateNewItemO;? ?re?}paint();???if(currentChoice?itemList??itemList[inde==14)[index].x1=e.gex].y1=e.getY();tX();??Stringinput;????input=JOptionPane.showInputDialog("可以添加你想写的文字咯!??input");//可以输入内容的对话框itemLis??itemList[in[inde[initemListitemList=input;dex].x2=f1;x:.y2=f2;?//f1,f2用来存放当前字体风格dex].s2=stylel;????indeX++;currentChoice= 14;?????createNewItem(drawingAre??}?}.rePaint();publicvodmouseReleased??getY()stat+"]"usBar);setText("Mouse(MouseEventReleased@:["e){+e.getX()+","+e.??if(currentChoice==3||currentChoice==13){???itemList[index].x1=?itemListe.ge[index].y1=e.getYtX();();??????itemLis1te?indet[indmLisex:.x2=e.getX()t[index].y2=e.geX++;??createNewItem();?repaint() ;t丫();(5)mouseB监听鼠标拖拽和移动,在鼠标拖拽的时候,由于鼠标的拖拽一定是在单击之后的,所以mouseA和mouseB的监听功能必须连在一起来分析,上面得知,如果事件源是铅笔或橡皮,鼠标单击就得到了第一个点,紧接着鼠标,只是第一个点的x2,y2一,则鼠标开始拖拽,拖拽的过程中,也一直在动态的得到点直在以点的长度动态增加,index++;如果事件源是绘制其它图形的按钮在动态拖拽的过程中只需要,得到点(x2,y2)就好:classmouseBeXtendsMouseMotionApubl??statusicVoidBar.semoustText(eDragged"MouseDdapter{(MouseEventeragged@:["+e.){getX()+",“+e.getY()+"]");???if(curre?itemntChoicemList==3|List[index[index].x1=e.get:IcurrentChoi c].x2=itemLisX();e==13){t[index].x2=ite[index?itemList[index].yl=e.getY();-1].y2=itemList[index].y2=itemList??indeX?}else???itemList???itemLis??}??repaint?}??publicvoid?:statu++;c[();()+getYsBar.s"]");reateNewItem();{index].x2=e.gt[indeX].yetX();2 =e.getY();mouseMovedetTex(MouseEvente){t("MouseMoVed@:["+e.getX()+","+e.??}2基本图形类3.2.1父类Drawingsclas?int?int?float?intsDrawingsimplx1,y1,x2,y2;R,G,B;stroke;tyementsSerializable{Pe;?Strin?Voigs1,s2;raw(Graphics2Dg2d){};3.2.2子类(只列出部分)(1)铅笔:1assPencilextendsDrawings{voiddraw(Graphics2Dg2d){g2d.setPaint(newColor(R,G,B));?g2d.setStroke?g2d.drawLine(}newColor((newBasicStroke(strokey1,x2,y2);⑵空心圆1assCircleextend?voiddraw(Graphicsg2d.setPaintg2d.setStro?g2d.drawOval(MatDrawingsDg2d){(newColor(ke(newBaR,G,B));sicStroke(h.min(x1,));stroke));x2),Math.min(y1,y2),????Math.max(Math.abs(x1-x2),Math.abs(y1—y2)),Math.max(Math.abs(x1—x2),Math.abs(?}yi-y2)));(3)实心圆ssfil1Circ1eexvoid??g2d.set? g2d.? g2d.draw(GraphicPaintsetStro(nekendsDrawings{g2d){or(R,G,ax(Math.}(4fillOval(MaMath.(newBasicStroth.min(x1,max(Math.abs(xabs(X1-X2),Mac1assRubberextendsB));ke(stroke))x2),Math.1-x2),Math.minabs(y1,y2),(y1-y2)),Math.mth.abs(y1-y2)));voiddraw(Graphics2Dg??g2d.setPaint( newCo1g2d.setStroke(new?g2d.drawLine(x1,y1,}Drawings{2d){(255,2 55,orBasicStro255));ke(stroe+7));X2,y2);(5)文字classWordextendsDrawingsvoiddraw(Graphics2Dg2d?g2d.?gifsetPaint(2d.setFont(n(s1!=null)?g2d.drawStringnewColor(Fon{){R,?}}GB));(s2,x2+y2,((int)1,y1);troke)*30));4设计中的难点4.1多态与动态绑定绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。动态绑定:在运行时根据具体对象的类型进行绑定。若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断实际对象的类型,并分别调用相应的方法。JAVA中的多态就是借助动态绑定来实现的。先定义一个父类Drawings实现接口Seria1izable,里面定义一个draw(),然后所有的基本图形类都从父类继承,作为子类,它们都重写了父类的draw方法,但是每个draw()都不一样,在绘制任何形状的时候,只需要简单的调用父类的draw()即可,然后让程序动态的根据对象的类型,决定使用哪个子类的draw方法,为了使画出的图形更加的美观,我在draw方法中使用了Graphics2D对象的引用。这样,有了多态的存在,就可以在不改变原程序的情况下,对其可以画出的图形进行扩展,丰富程序的功能。4.2重绘的理解当一个窗口被构造出来的时候,里面就有一支画笔,在这个窗口出现再次显示、或大小改变等情况的时候,窗口就需要被重画,只要窗口需要被重画,Paint就会被自动调用。repaint的作用是让窗口进行强制重画,其内部调用了paint方法,所以整个窗口在调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年己二酸二甲酯项目建议书
- 全程融资合同范本
- 商铺转租赁合同
- 超市柜台租赁协议
- 佳木斯市个人车位租赁合同
- 2025年海洋潜标系统项目合作计划书
- 2025年碳纤维正交三向织物项目合作计划书
- 2025年X射线管项目发展计划
- 2025个人承包土地合同书
- 2024年零星建筑工程施工合作合同范本版B版
- 2024届甘肃省平凉市静宁县英语九年级第一学期期末教学质量检测模拟试题含解析
- 隐患排查治理工作方案
- 辅导员工作汇报课件
- 企业清产核资报表
- 新版小学道德与法治课程标准的解读与梳理培训课件(道德与法治新课程标准培训)
- 公司金融学张德昌课后参考答案
- DB3302-T 1015-2022 城市道路清扫保洁作业规范
- 手术室提高患者术中保温措施的执行率PDCA课件
- 基本事实要素表
- 市场监督管理局企业注册、经营范围登记规范表述:行业分类及条目代码
- 2023年中国工商银行度校园招聘笔试题库及答案解析
评论
0/150
提交评论