课程设计JAVA画板模拟画图工具_第1页
课程设计JAVA画板模拟画图工具_第2页
课程设计JAVA画板模拟画图工具_第3页
课程设计JAVA画板模拟画图工具_第4页
课程设计JAVA画板模拟画图工具_第5页
免费预览已结束,剩余19页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计-JAVA-画板-模拟画 图工具作者:日期:1课题介绍 11.1 课程设计目的 11.2 课程设计要求 11.3 课程设计主要知识点 12总体设计 32.1 画板界面设计图 32.2 模块概述 32.2.1 文件操作 32.2.2 图形绘制 33详细设计与实现 53.1 框架类 DrawGraphic 53.1.1 菜单 53.1.2 工具栏 73.1.3 画图区域 83.2 基本图形类 113.2.1 父类 Drawings 113.2.2 子类(只列出部分) 114设计中的难点 134.1 多态与动态绑定 134.2 重绘的理解 134.3 文件的新建、打开和保存 135运行测试

2、146总结 16参考文献 171课题介绍1.1 课程设计目的课程设计题目:模拟画图要求设计一个程序,模拟 Wind ows中的画图程序,实现图形图像的编辑,修 改,保存等功能。1. 2课程设计要求(1)程序中必须包括“新建”、“打开”、“保存”,用户可以选择,实现对文 件的操作;(2)画图板的绘图按钮用来画出不同的图形,包括实心图形和空心的图形;(3 )可以对线条的颜色和粗细进行设置, 也可以对填充图形的颜色进行设置 和更改。1. 3课程设计主要知识点(1 ) 框架类Dr a wGraphic继承了 Sw ing类库中JFr a m e ,并且用到 JButton, J L abel , J

3、P ane l ,等Swi n g类库中的组件进行窗体设计;(2)选择一个文件,用到组件J;(3)选择颜色,用到组件J C olorChoose r ;(4)弹出标准对话框,用到组件J O pt ionPa n e;(5 )在单击绘图按钮时,所触发的动作通过方法ad d Act i o n Li s t e ner 和 ActionL i s t e ner 接口的 actio n Per forme d方法共同实现;(6 )Mou s eAdapte i和 Mo use MotionAdapte r 用来完成鼠标各种事件 的相应操作,包括单击、移动、拖拽等;(7)在界面设计的时候结合 Bo

4、rder Layout和Grid Layout两种布局格(8)在添加监听器的时候有用到内部匿名类和内部类,所以要熟悉它们的构造方法和使用方法,从中体会持有对方引用的这一设计思想。(9)在图形绘制的时候,用到 Gr a p hic s类,其揭示了所有图形系统几乎 都采用的一种机制,就是如何在窗口上画出一些图形来 ,当窗口构造出来的时候 里面有一支画笔,即 Graph i cs的一个对象,当窗口调用p ai nt方法的时候, 系统会把画笔自动传递给它,拿到画笔,重写paint方法就实现了在窗口上绘制 基本图形。2总体设计2 .1画板界面设计图定义框架类DrawG r aphic,然后在框架上直接添

5、加菜单栏,整个框架采用 Borde rL ay ou t的布局格式。工具栏、显示鼠标位置的标签、主要的画图区 域分别在框架的 west,south , center三块区域。而浮动式工具栏采用的是G ridLay o u t布局格式,其初始方向设定为V ER TI C AL ,如下图所示:2. 2模块概述2. 2.1文件操作文件的新建,打开,保存可以添加内部匿名类的方式实现,new 一个事件监听 器Action Listener,里面调用actionPerformed 的方法,被监听的按钮一旦被 触发就调用函数执行相应的操作。2.2.2 图形绘制在工具栏里面实现了基本图形的绘制,图形属性的设置

6、,如画笔粗细和画笔 颜色的设置,以及橡皮擦,文字输入等功能,而这些功能的实现都是通过添加内部事件监听器类来实现的。一个类用来监听绘制基本图形以及橡皮擦按钮;另一个类用来监听的是选择颜色按钮、选择画笔粗细按钮、和输入文字按钮,里面都 用if语句和e.g etSou rce来判断事件源,从而在触发时,调用不同的函数, 当事件源为输入文字时, 用JOptionPane.showMessa g eDialo g来弹出一个提 示操作的对话框。画图区域的功能主要是通过添加鼠标监听器来实现的 :一个鼠标监听器监听的是:单击鼠标,释放鼠标,鼠标进入绘图区域 ,鼠标 离开绘图区域这四个鼠标的动作事件;另一个监听

7、的是:鼠标拖拽和鼠标移动。而且,两个监听器之间是存在着密 不可分的关系的,它们同时监听画图区域。铅笔作画和橡皮擦的使用是画图板设计的核心也是难点,而且两者的实现原理是一样的,我们通常画图的时候,一定是先单击鼠标然后拖拽鼠标最后释放鼠 标的,所以,在画图的过程中,只要鼠标单击一下就获得(x 1 , y1),紧接着用1 f语句判断画的基本图形是哪一个,如果是铅笔或者橡皮擦,则获得(X 2 , y 2), 说明在铅笔或橡皮擦的时候,鼠标单击一下,就获得一个点,x 1 =x2,y1= y 2,且这 个点的坐标就是鼠标单击的位置,而且这个点是算作第一个基本图形的,此时in d ex=1;拖拽的过程中动态

8、获得鼠标所在位置的横纵坐标且始终x1=x2,y1=y2,并且等于第一个基本图形也就是i n dex=1的那个点的x2, y2,即,在铅笔作画 的过程中,在鼠标不断拖拽的过程中,inde x =1时的那个点在以点的点的长度不 断增加,这就是铅笔作画过程的实现;鼠标释放的时候,在铅笔或橡皮的状态下, 也是得到一个点。所以,可以总结,铅笔和橡皮都是通过设置画直线方法中的点 的坐标相等来实现的。其它图形的绘制,可以直接调用Graphics2 D中的方法实 现,相对比较简单。3详细设计与实现3.1 框架类 D r a wGraph ic3. 1. 1菜单菜单栏有两个按钮“画图板”、“帮助”,通过添加内部

9、匿名类来实现,一旦 下拉菜单中的“新建”、“打开”、“保存”、“退出”四个键被触发,就调用相关的 函数,具体代码如下:(1 ) “新建”执行时,调用的函数代码如下:p u b l i c void new File() ind e x = 0 ;? c urrentCho i ce = 3;?colo r = Col or. B LU E;? stro k e = 1 . 0f;creat e N e w Item();?rep a int();?(2) “打开”执行时,调用的函数代码如下:? public v oid openFil e ()J = new J (); /为用户选择文件提供了

10、一种简单的机制?;1 n t res u 1 t = (th is);/弹出一个"Open Fil e "文件选择器对话框, 父组件?if (resu 1 t = J . CANCEL_ O P TIO N) return ;? F i le =();? () ; /测试应用程序是否可以读取此抽象路径名表示的文件?i f ( = = n u 1 l | |().equa 1 s ( " " )? ?JOpt i onPa n e . show Mes s age D i alog (,"这个名字不可以用的 ",""

11、,? J OptionPan e . ERROR_MESSAGE );? els e ?try ?fis = n e w ();? i n put = new O b j e ctInp u t S tream ( f is );?int c o un t N umb e = =0;? co unt Number = in put.r e a dInt();?for ( i nd e x =0 ; i n dex < c o u n tNum b er; i nde x + + ) ? Draw i ng s i n p u t R ecord = (Dr a w in g s) inp

12、u t . readObject();? ite m L ist in dex = i nput R ec o rd;? crea t eNe w I t em();? inp u t . clo s e();?repaint ();? c a tc h (E O FExc e p t i on e n d of) /当输入过程中意外到达文件或流的末尾 时,抛出此异常? J Op t ionPa n e . showMessageDial o g (this , "n o more rec o rd inf i l e ",?" e n d of );? cat

13、c h(Clas s N o tFo u ndE x ce p ti o n cla s s NotFoundExcept i o n)? JOp t ionP a ne . s howMessage D ialo g (this , "una b le to create ob j ect", ?"cl ass not foun d" , J Op t ion Pan e. ERRO R_MES S AGE); ca t ch (I O Exceptioni oExc e p t ion)? JOpt i o nPane. sho wMe s s ag

14、eD i alo g ( t his , "error d u r in g rea d from file" ,? "re ad error" ,JOpti o n P a ne. ERROR_ME SSAGE);? ?(3) “保存”执行时,调用的代码如下:p u bl i c voi d saveFile()J = new J ();? (J.);/允许用户只选择文件? int re s u lt = (this);/弹出一个 "Sa v e Fi 1 e"文件选择器对话框if (result = J . CANCEL_OP T

15、I O N) return;? Fi 1 e =();?();1 f ( = n u 1 l |().equa1 s( " " )?JOp t i onPan e . sho wMe s Jt i onPane . E R ROR_M ES S AGE);? ? e l s e? try ();? fos = new ();? ?outpu t = new Objec t Outpu ? outpu t .w r i t e Int( index );?for ( i nt i = 0; i <ind?D r a wing s outpu t R e?out p ut

16、 . wri t eObjecObjec t O ut p utS t ream? ou t put .fl u sh(); 们刷新到底层流中? sage Dial o g (,“这个名字不可以用的","",JOpt St ream (fos );?/ /写入一个32位的int值ex; i +)co rd = i t e m L i st i;t (outputR e cor d ); ?/将指定的对象写入? /此操作将写入所有已缓冲的输出字节,并将它? output .c 1 ose();? ?f o s . clo s e ();? catch (lOExce

17、 ption io e ) ? ioe. p r i ntStackTra c e();?3.1.2工具栏工具栏按钮功能的实现,是通过添加两个内部事件监听类Bu t to n Handle r 1、Bu t t onHandler2 来达到目的的。ButtonHa n dler1监听绘制基本图形的按钮,if语句判断事件源,具体 代码如下:pub 1 ic c la s s Button H a ndler1 i m p lements Act i onListene r ? p u b 1 ic v oid act ionPe r for m ed(Ac ti o n E vent e) ?

18、?f o r( in t j= 3;j <choi c es . leng t h-3 ;j+)? if (e . getSou r ce()= c h o i c es j )? c ur r entCho i ce = j;? ?createNewItem();? repaint() ;? ?(2) Bu t t on Ha n d 1 er2监听颜色选色器、画笔粗细、添加文字按钮,if 语句判断事件源,相应的按钮被触发,就执行相应的函数,具体代码如下: p u b lic class Butto n Handle r 2 im p lement s A c t i o n L is

19、tener? p u b licv oid a c t i onPerfo rmed (A c tionEvent e)?i f (e.gets our c e()= choices cho i c es .le n g th-3 1 ) ? chooseCo 1 o r ();? ? i f (e.getSource() = = choices c h oi c es . le n gth -2 ) ? setSt r o k e();? ico n = ne w I m ageIcon(getClass().getRe s o u r c e (" /i m ages /sm i

20、 1 e.png" );? i f (e.getSour c e( ) =choi c es choice s . le n g t h-1 1 ) ? JO p tio n Pan e . sho w Messag e D ialog (null ,"想在哪里添加文字呢 ?鼠标先点一下那里吧!",?"" ,JOptionPane. I NFORMATION_ MESSAGE, icon);?cur rent Ch oice = 14;? createN e wItem();? r e p a int();? 3.1 .3画图区域(1 ) cr

21、e a teN e w Item()用来new各种基本图形,在函数的一开始,我设置C 6来判断用了一下光标的样子,然后用s w it c h函数接收cu r ren t C h oi户要n ew的是哪一个基本图形,关键代码如下14)voi d crea t eNewItem()if ( c u rre nt Choiced rawingAre a .setCEXT _ CURSOR);u rso r (Cursor . get P re de finedCur s or(C u rs or.e 1 se dr a w i n g A rea .s OSSHAIR _CURSOR);e tCur

22、sor ( C ursor . ge t Predef i nedCursor(Curs.CR? ? switc h (currentChoicecase 3 : i t e miL i s tind exnew?case 4: it e mL i st? c a se 5: itemListcase 6: itemL?ca s e 7: itec ase 8 : itemLicase 9: itemListindexindexn e w Li nnew RectPe n cil() e () ; brea ();breakeak ;i st m Listi ndexnew f i llRin

23、 dex = new Ovae c t (); brea 1(); break ;s t index index =ne w fill O val( ) ; break;ne w?case 1 0: itemLi s t in d ex C i r cle ()new f i 1c ase11: item Li s t in d ex ne w;brea k ;1 Circle(); breakR o u n d R ect();Jbreaks secas e13:c ase14:12: i temLi s t index i temLi s t index = it e mLi s t i

24、nd e x =n ew fnew Rubbenew Wor川 R o u ndR e ct();r (); break ;d (); brea k ;br e a k? itemListi t emListindex . typei n d ex . R =cu r rent Choi c e ;R;itemLi s t index . G =i tem Li s t in dexG;.B = B;? i tem L ist index. stroke = st r o ke ;(2) choos e Co lor()用来选择各种颜色,具体代码如下:p ublic vo i d choose

25、Color( ) ?c o lor = J C o lorC h ooser .sho wDi a log ( null ,"在这里选择自己喜欢的颜 色",c o 1 or );?R = colo r .getRed();? G = c o lor . ge t Gree n ();? B = c o l o r . g e tBl u e(); (3)se t Stroke()用来设置画笔粗细,具体代码如下: public v oi d se t St r o k e( ) St r ing inpu t ;i nput = J Opti o nPane. s ho w

26、In p utDi a log ( null , 11 在这里重新输入画笔 的粗细值(一个0的实数)","1.0 ");? strok e = Float. parseF1 oa t (inpu t); /将字符串参数转换为一个floatit e mL i s t i ndex .st r ok e= stroke;(4 ) m ouseA监听鼠标单击、释放、进入、离开四个事件,当鼠标单击的时 候,用e . getS our ce()先得到一个点白坐标初始化(x 1 , y1),再判断单击的 是哪一个按钮,如果是绘制其它图形的按钮,那就光得到一个点(x1, y1)

27、;如果 是铅笔或者橡皮擦,则继续初始化第二个点的坐标(x2,y2),此时x 1=x2,y 1 =y2, 即鼠标单击绘出一个点,而这个点是用绘直线方式画出的,表示已绘制的图形个 数的i n de x + + ;如果是添加文字按钮,则弹出一个可以输入文字的对话框。当鼠标释放的时候,如果是铅笔或橡皮,同样得到一个点,如果是绘制其它图形的基 本按钮,那就光得到(x2,y2),关键代码如下: c las s mo u seA e x t e nds Mouse A d apte r ? p u b li c void mousePre s sed( Mo u seEvent e ) sta t u s

28、Bar .setText( "Mou s e Presse d : 11 + e.get X()+" +e.g etY() +"");?itemLis t i nd e x. x1 =e.g e tX(); ? item L ist in dex . y1 =e.getY ();?i f (curren t C ho i ce = 3| | curr e n t C h oice =1 3) ?item L is t index . x2 = e.g e tX();? i te m List i n de x . y2 = e . g e tY(); ?

29、 inde x +;? c r e a te N ewItem();? r e paint();? if ( curren t Ch o ice = 1 4 ) ? itemL ist in dex . x1 = e.ge t X (); ? item L i st i n de x . y1 = e . getY();? S t ring input; ? input = J 0 Pt ionPane.show InputD i alog ( 11 可以添加你想写的文字咯!");/可以输入内容的对话框it e m Li stind ex.si = in put;? itemL is

30、tindex.x2= f 1 ;? i te m L ist inde x . y 2 = f2 ; ?/ /fl , f2 用来存放当前字体风格? itemList in d ex . s2 = s ty 1 e l ;? ? i n d e x +;? currentCho i c e = 14;? c reateNe w Item();? dr a w i n g Ar e a .re p aint();? ?public vo i d m ouseR e leas e d (M o u s eEvente )+ e.? s t a t usBar . s e t T e xt( 11

31、Mo u se Rel e a sed :" +e. g e t X () +", getY() +"");? i f(curr ent Choi c e = 3| cur re n tC h o i ce = = 1 3 )? i temLis t index. x 1 = e.getX();? i t emL ist i n de x . y1 = e.getY ();? i temL i s t in d ex . x2 = e . getX ();? i t e miL i s t index . y2 = e.ge t Y();? inde x

32、 +;? crea t eNe w Item();? r e paint() ;(5) mou s eB监听鼠标拖拽和移动,在鼠标拖拽的时候,由于鼠标的拖拽一 定是在单击之后的,所以 mouseA和mo useB的监听功能必须连在一起来分析, 上面得知,如果事件源是铅笔或橡皮,鼠标单击就得到了第一个点,紧接着鼠标 开始拖拽,拖拽的过程中,也一直在动态的得到点,只是第一个点的x2, y2 一直在以点的长度动态增加,i ndex+;如果事件源是绘制其它图形的按钮,则鼠标 在动态拖拽的过程中只需要,得到点(x2,y2 )就好: class mouseB e x tend s M o useMotio

33、nA d ap t e rpubli cv oidm ouseDragged ( Mouse E ve nte)?st a t u sB a r.s etText(11Mou se D r agged: 11+e .getX()+"," + e .getY () +"");? if ( curren tChoice= 3|cu r r e ntChoi c e =13)? itemL ist index -1.x2 = i t e miL is t index.x2=itemList inde x . x1 =e. g et X ();? i temL

34、i s t index - 1 . y 2 = i t emL istindex. y 2= it emLis tindex . y1 =e. g etY();?in d e x +;e a teN e w I t em ()?else? item Listnd e x. x 2 = e.g e? it emLisi n de x . y2 = e.tX();g et Y ();?repa ();? publicvoidm o useMovedgetY? s tatu()+"");etTex(Mou s et ( " MoE ven tu se Moe)v ed:

35、 " +e. g etX()+? 2基本图形类3.2.1父类 Drawin g sclas? i nt?int?floats Drawings impl x1 , y 1, x2 , y2 ;R, G, B;s tr o k e ;e men t s Se r ia 1 iza ble?i n ttyP e;? S t r in? v oig s1 , s 2 ;r a w (G rap hic s2 D g 2d ) ;3.2.2子类(只列出部分)(1 )铅笔:ass P e n c i 1 exte n ds Drawingsvo i d d raw ( G r aphic s

36、2 D g2d) g2d.set P aint( ne w Color( R, G,?g2d.setStr o ke(newBasicS tB);r o k e (stroke);?g2 d .dra w Line(y 1, x2,y2);空心圆a ss Circ 1 e e xtendDr a wings? void d r a w(Graphics g2d . s etPain g 2 d.set S t r(? g 2d. dra wOval(MatD g2d ) (new Color( ke (new Bah . mi n ( x1 ,R, G, B);s ic S tr o ke(s

37、tr o k e );x2 ),Math. mi n (y1 , y 2 ),? Math. max (Mat h. abs ( x1 - x2), Math. abs ( y 1 y2),Math . max (Ma t h . a bs ( x1 x2 ),Mat h . ab s ( y 1- y2 ); ?(3)实心圆class fil 1 Ci r c 1 e ex t e n d s Dr a wings voi d draw(Graphic s 2 D g 2d ) ? g2d.set P ai n t ( ne w Col o r( R, G, B);? g2d . se t

38、Stro k e ( new B asicStro k e( s tr o ke );? g2d . f川Oval(Mat h . m i n (x1 , x2 ),Mat h . min (y1 , y2 ),? Math . max (Ma th. abs (x1-x2),M a th. abs ( y 1 - y2 ) ), Math. m ax (Math . ab s ( x 1 - x 2),M a th. a bs (y1 - y2 );(4 )橡皮擦:c 1 ass Rub b e r ex t e nd s Drawings vo i d d r a w(Graphics2D

39、 g 2d) ? g2d.se t P aint( new Color ( 255,2 5 5, 2 55);g2d.s e t Stroke( newBas i c S tro ke(stro ke+7);?g2d . drawL i n e (x1 , y1 ,x 2, y 2);(5)文字cla s s Word exte n d s D rawings v o id d r aw(Gr a phics2D g2d ) ?g2d . s e t P ai n t( new Color( R, G, B );?g 2 d.se t Fo n t( new F o n t ( s2 , x2

40、 + y 2,( int ) s troke )*30);? if (si! =null )?g2d.drawString ( s 1, x 1 , y 1 );?4设计中的难点4.1多态与动态绑定绑定指的是一个方法的调用与方法所在的类 (方法主体)关联起来。对java 来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。动态绑定:在运行时根据具体对象的类型进行绑定。若一种语言实现了后期 绑定,同时必须提供一些机制,可在运行期间判断实际对象的类型,并分别调用 相应的方法。J AVA中的多态就是借助动态绑定来实现的。先定义一个父类 Drawi n gs实现接口 S e ria 1 i

41、z able,里面定义一个 draw(),然后所有的基本图形类都从父类继承,作为子类,它们都重写了父类的 d r aw方法,但是每个d raw ()都不一样,在绘制任何形状的时候,只需要简单的 调用父类的d raw()即可,然后让程序动态的根据对象的类型,决定使用哪个子类 的d r aw方法,为了使画出的图形更加的美观,我在draw方法中使用了 Graphic s 2D对象的引用。这样,有了多态的存在,就可以在不改变原程序的情况下, 对其可以画出的图形进行扩展,丰富程序的功能。4. 2重绘的理解当一个窗口被构造出来的时候,里面就有一支画笔 ,在这个窗口出现再次显 示、或大小改变等情况的时候,窗口就需要被重画,只要窗口需要被重画,paint 就会被自动调用。r e pai n t的作用是让窗口进行强制重画,其内部调用了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论