瘋狂java實戰(zhàn)演義源碼第06windows畫圖_第1頁
瘋狂java實戰(zhàn)演義源碼第06windows畫圖_第2頁
瘋狂java實戰(zhàn)演義源碼第06windows畫圖_第3頁
瘋狂java實戰(zhàn)演義源碼第06windows畫圖_第4頁
瘋狂java實戰(zhàn)演義源碼第06windows畫圖_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

6章仿WindowsWindows系統(tǒng)的讀者都比較熟悉,是一種比較簡單與具有代表性的畫圖工具,雖然功能不夠強大,但具有大多處理程序所必需的基本功能:鉛筆畫圖、各種數(shù)學函數(shù)圖形、填色、取色、橡皮擦等等槍、顏色編輯等功能,除了這些繪圖功能,還會實現(xiàn)打開、保存等文件操作功能。畫圖工具的最終效果如圖6.1所示。6.1drawLine方法后,我們再對界面的組件進行一次repaint就可以實現(xiàn)畫線的功能。drawRect方法。如果需要實現(xiàn)橡皮擦的功能,可以將鼠標經過的區(qū)域畫上白色的線。實現(xiàn)噴涂的功能,可以在當前鼠標點擊的區(qū)域中畫上相應的點,Graphics類中提供了一個我們可以在畫圖的界面中保存一個BufferedImage的對象,那么可以通過這個對象得到一個候,我們可以將這個BufferedImage對象通過ImageIOwriter方法寫到文件中。Java程序來實現(xiàn)畫圖的原理,實現(xiàn)程序就十分的簡單,關鍵是如何計算各個工具的使用Windows的畫圖軟件,發(fā)現(xiàn)在編輯的時候,有個相似的過程,首先是用鼠標選擇需要使Tool的接口,這個接口是所有工具的接口,里面定義了一系列的鼠標動作。在本章中,畫圖軟件的主界面使用ImageFrame,該類繼承于JFrame,該類會初始化畫圖軟件的各種組件。由于我們有選擇打開文件的操作,所以會有一個擴展javax.swing.JFileChooser類(為Tool的實現(xiàn)類去實現(xiàn),所以除了繪圖外的其它功能的邏輯實現(xiàn),就全部放到ImageService類中,本章中的類圖如圖6.2所示。6.2String類型的常量屬性來定義工具的類型。這個接口只有一個實現(xiàn)類Tool,而每個工具類staticfinalStringBRUSH_TOOLstaticfinalStringERASER_TOOLstaticfinalStringLINE_TOOLstaticfinalStringRECT_TOOLstaticfinalStringPOLYGON_TOOLstaticfinalStringROUNDRECT_TOOL(言之,使用者只與ToolFactory耦合。Tool的實現(xiàn) 的實現(xiàn),那么它的子類就可以不必再做重復的實現(xiàn),只關心與本類相關的邏輯,Tool所定義的 數(shù),path是工具的圖標路徑。(voidcreateShapeMouseEvente,Graphicsge去獲取鼠標的軌跡,并用Graphics類型的對象g去畫圖形。voiddragBorder(MouseEventeLineolRectolPolygonolRoundol情況重寫ToolTool接口,不希Tool類型的此類實現(xiàn),如下:)new關鍵字來創(chuàng)建這些類的實例,因此在這里使用了單態(tài)模getInstance的方法來返回本類的實例,并且所有的構造器都是私有的。在下面的章節(jié)中,將會講解如何實現(xiàn)這11個子類。voidsetTool(Tooltoolvoidpaint(GraphicsgTool的實除鼠標的畫圖功能外(畫圖功能由Tool的實現(xiàn)類完成初始化畫板、的新建打開與保存、各),)staticCursorcreateCursorStringpath,創(chuàng)建鼠標圖形。Pathvoidsave(booleanb,ImageFrameframe),保存voidopen(ImageFrameframe),打開voidcreateGraphics(ImageFrameframe),創(chuàng)建新并初始化voideditColorImageFrameframevoidexit(ImageFrameframevoidDo(ImageFrameframe,Stringcmd),處理菜單booleanaccept(Filef幾部分組成,用BorderLayou的排板方式,左邊在BorderLayou.WEST位置,畫圖區(qū)在BorderLayout.CENTER位置,顏色選擇面板在BorderLayout.SOUTH位置。先看主界面的初始化:首先,設置JFrame窗口的標題,接下來初始化畫圖區(qū)域,初始化為白色,然后再獲取最后獲取左邊面板、下面菜單欄面板、菜單,并把這些面板與畫圖獲取加到JFrame中。見以下publicvoidinit()publicvoidinit()this.setTitle-畫圖tooltool=ToolFactory.getToolInstance(this,PENCILTOOL MouseMotionListenermotionListener=newMouseMotionAdapter(){tool.mouseDragged(e}publicvoidmouseMoved(MouseEvent{tool.mouseMoved(e} MouseListenermouseListener=newpublicvoidmouseReleased(MouseEvente{tool.mouseReleased(e}{tool.mousePressed(e}{tool.mouseClicked(e}drawSpace.addMouseListener(mouseListener); scroll=newJScrollPane(drawSpace//設置//panel加到本Frame//this.add(toolPanel,BorderLayout.WEST} 方法,MouseListener負責 鼠標的其它動作,我們實現(xiàn)了它的mouseReleased(松開鼠標、碼分別創(chuàng)建菜單、畫圖與顏色選擇面板,如何創(chuàng)建在6.4.3、6.4.4和6.4.5中詳細描述?,F(xiàn)在運行畫圖工具,可以看到效果如圖6.3所示。6.3//publicclass//publicclassDrawSpaceextendsJPanel*@paramg@returnpublicvoidpaint(Graphicsg)}}JPanelJPanelpaint方法,這而獲取這個畫板就是去創(chuàng)建一個這個畫板類的實例,由于我們的畫圖軟件是每次都只編輯一張,所以這個創(chuàng)建畫板的方法在本類中只被調用一次。首先是new一個DrawSpace實例,再設置這個drwaSpace的大小,并且返回,見以下代碼。代碼publicJPanelcreateDrawSpace()JPaneldrawSpace=new//設置drawSpacenewDimension(,(int)screenSize.getHeight()-150));returndrawSpace;}publicvoid Bar() Bar=new publicvoid Bar() Bar=new ItemArr一一對 Arr文件(F查看(V)",顏色(C)",幫助(H ItemArr={""編輯顏色{"幫 ","關于" Arrfor(inti=0;iArr.length;i++)=new(Arr[i] for(for(intj=0;j ItemArr[i].length;j++)//如 if ItemArr[i][j].equals("-"))}else Item=new Listener Item}} }//設置 Bar}6.4形和圓矩形,這里,每個工具我們用一個JButton去代表它,使用JButton的JButton( action)構造器去創(chuàng)建JButton,用這個構造器創(chuàng)建JButton,可以在Action中加入按鍵的圖標,以圖形的方式創(chuàng)建按鈕,另外,我們會有一個Action的實現(xiàn)類。見以下代碼: publicpublicJPanelcreateToolPanel()JPanelpanel=newJToolBartoolBarnewJToolBar(工具toolBar.setMargin(newInsets(2,2,2,2)toolBar.setLayout(newGridLayout(5,2,2,2)String[]toolarr={PENCIL_TOOL,BRUSH_TOOL,,ATOMIZER_TOOL,ERASER_TOOL,LINE_TOOL,for(inti=0;i<toolarr.length;i++{ImageActionaction=newnewImageIcon("img/"+toolarr[i]+,toolarr[i],thisJButtonbutton=newJButton(action }}首先,我們創(chuàng)建一個放置這些按鈕的JToolBar,JtoolBar是JavaSwing提供的一個 設置JToolBar的標題、排列方式(垂直、是否可以拖動、與邊界的距離、還有布局方式,接下來遍歷存放這些工具類形的數(shù)組,每次都以工具圖標的路徑、工具名去創(chuàng)建一個ImageAction( Action的ImageAction去實現(xiàn),見ImageAction中重寫的actionPerformed方法,這個方法就是用來執(zhí)行到按鈕被點擊后的方法。publicvoidactionPerformed(publicvoidactionPerformed(ActionEvente)tool=name!=""?ToolFactory.getToolInstance(frame,name:if(tool!=null)//設置正在使用的toolframe.setTooltool}if(if(color!=null)Tool.color=color;}}nameTool是用在顏色選擇時用到,如果color不為空,就把當前的顏色設置為被選擇的顏色。加入了畫圖工具欄后,具體的效果如圖6.5所示。6.5加入畫圖GREEN、LIGHT_GRAY、MAGENTA、ORANGE、PINK、RED、WHITE、YELLOW創(chuàng)建的過程類似,用設置了顏色的按鈕去代表這些顏色,首先創(chuàng)建一個JToolBar去放置這些顏JToolBar的布局方式、標題、是否可以拖動等屬性,最后去遍歷保存這些顏色類ImageActionImageActionJButton,同時設置這個JButton的顏色,最后加到JToolBar中。見以下代碼。publicJPanelcreateColorPanel()publicJPanelcreateColorPanel()JPanelpanel=newJToolBartoolBarnewJToolBar(顏色toolBar.setMargin(newInsets(2,2,2,2)toolBar.setLayout(newGridLayout(2,6,2,2)Color[]colorArr={BLACK,BLUE,CYAN,GRAY,GREEN,LIGHT,MAGENTA,ORANGE,PINK,RED,WHITE,JButton[]panelArr=newJButton[colorArr.lengthcurrentColorPanel.setBackground(Color.BLACK);currentColorPanel.setPreferredSize(newDimension(20,20));for(inti=0;i<panelArr.length;i++)panelArr[i]=newJButton(newImageAction(colorArr[i],currentColorPanel)}panel.add(toolBar);return}6.6選擇面板與畫圖區(qū)域等。接下來,逐步實現(xiàn)畫圖里面的功能。前面說到,這里的工具類設計是有一個定義了工具所有方法的接口Tool,這個接口有一個實現(xiàn)類 6.76.7ToolToolmouseDragged、mouseMoved、mouseReleased、mousePressed、mouseClicked五個方法接口,由其實現(xiàn)類實現(xiàn),接下來先了解所有工具類的父類:Tool。JScrollPane,因此對畫布進行拖動,就可以設置畫布的大小。在TooldragBorderpublicvoiddragBorder(publicvoiddragBorder(MouseEventeintx=cursorType==Cursor.SRESIZECURSOR Tool.drawWidth:inty=cursorType==Cursor.WRESIZE MyImageimg=null;if((cursorType==Cursor.NWRESIZE||cursorType==Cursor.WRESIZE||cursorType==Cursor.SRESIZECURSOR)&&(x>0&&y>0)){img=newMyImage(x,y,BufferedImage.TYPEINTRGB);Graphicsg=img.getGraphics(); getFrame().setBufferedImage(img);Tool.drawWidth=x;//設置,frame.getDrawSpace(),x,y}}這個方法由ToolmouseDragged方法調用,也就是有鼠標拖動動作時,肯定會調用到部分xy坐標創(chuàng)建一張的畫布上。ToolmouseDraggedToolmouseDragged的實現(xiàn)。畫出矩形、橢圓形等圖形。在Tooldraw方法完成這些工作,但這只是一個空方式處理,避免子類的draw方法的代碼重復。privatevoidcreateShape(MouseEventprivatevoidcreateShape(MouseEvente,Graphicsg)if(getPressX()>0&&getPressY()>&&e.getX()>0&&e.getX()< &&e.getY()>0&&e.getY()< Tool.drawHeight){ ,Tool.colordraw(g,getPressX(),getPressY(),e.getX(),e.getY()}} 的isSaved屬性(是否已經保存)改變?yōu)閒alse,候,就需要調用這個createShape的工具方法。teMethod”一個去創(chuàng)建一個Cursor,并調用drawSpace中的setCursor設置現(xiàn)在使用的鼠標類型,以下是ToolpublicvoidmouseMoved(MouseEventpublicvoidmouseMoved(MouseEvente)intx=e.getX();inty=Cursorcursor=if(x &&x Tool.drawWidth+&&y> Tool.drawHeight-4&&y<cursor=newCursor(Cursor.NWRESIZECURSOR}if(x &&x Tool.drawWidth+&&y>(int) Tool.drawHeight/2-4&&y<(int) Tool.drawHeight/2+4){cursor=newCursor(Cursor.WRESIZECURSOR}if(y Tool.drawHeight-&&y Tool.drawHeight+&&x>(int) Tool.drawWidth/2-4&&x<(int) Tool.drawWidth/2+4){cursor=newCursor(Cursor.SRESIZECURSOR}} Tool的 Tool的mousePressed方法的實現(xiàn) 6.5.5publicvoidmousePressed(MouseEvente) if(e.getX()>0&&e.getX() &&e.getY()>0&&e.getY() Tool.drawHeight{setPressX(e.getX());setPressY(e.getY());}}每次松開鼠標時,可能就是一個畫圖動作的完成,所以ToolToolmouseReleased方法時需要做兩步工作,一個是再次調用createShape方法去畫圖,另外一個是調用drawSpace的repaint方法去刷新,見以下代碼。publicvoidmouseReleased(MouseEventpublicvoidmouseReleased(MouseEvente)createShape(e,g);setPressX(-1setPressY(-1} Tool都已經實現(xiàn), publicvoidmouseDragged(MouseEvente{ if(getPressX()>0&&getPressY()>0){ Tool.colorg.drawLine(getPressX(),getPressY(),e.getX(),e.getY());setPressX(e.getX());setPressY(e.getY());}}使用鉛筆工具效果如圖6.8所示。6.8drawRoundRectpublicvoiddraw(Graphicspublicvoiddraw(Graphicsg,intx1,inty1,intx2,int{g.drawLine(x1,y1,x2,}publicvoiddraw(Graphicsg,intx1,inty1,intx2,inty2)//intx=x2>x1?x1:x2;inty=y2>y1?y1://g.drawRect(x,y,Math.abs(x1-x2),Math.abs(y1-}publicvoiddraw(Graphicsg,intx1,inty1,intx2,inty2)//intx=x2>x1?x1:x2;inty=y2>y1?y1://g.drawOval(x,y,Math.abs(x1-x2),Math.abs(y1- publicpublicvoiddraw(Graphicsg,intx1,inty1,intx2,inty2)//intx=x2>x1?x1:x2;inty=y2>y1?y1://g.drawRoundRect(x,y,Math.abs(x1-x2),Math.abs(y1-y2),20,}RoundToolRoundRectTool類。直線工具、矩形工具、橢圓形工具與圓矩形工具的具體效果如圖6.9所示。publicvoidmouseReleased(publicvoidmouseReleased(MouseEvente{intpressX=getPressX();intpressY=getPressY();if(firstX==-1)firstX=pressX;firstY=}lastX=e.getX();lastY=}首先是調用父方法的mouseReleased去畫直線,看粗 坐標與最后一個坐標畫一條直線(lastX,lastY,見下以代碼。publicvoidmouseClicked(MouseEventpublicvoidmouseClicked(MouseEvente)if(e.getClickCount()==2&&firstX>0&&e.getX()>0&&e.getX()< Tool.drawWidth&&e.getY()>0&&e.getY()< Tool.drawHeight){ Tool.color draw(g,0,0,firstX,firstY);draw(g,0,0,lastX,lastY);setPressX(-1);setPressY(-1firstX=-firstY=-lastX=-lastY=-1;}}6.10publicvoidmouseDragged(publicvoidmouseDragged(MouseEvente{intx=0;inty=intsizeif(getPressX()>0&&getPressY()>0&&e.getX()< &&e.getY()< Tool.colorx=e.getX()-getPressX()>0?getPressX():y=e.getY()-getPressY()>0?getPressY():g.fillRect(x-size,y-sizeMath.abs(e.getX()-getPressX())+,Math.abs(e.getY()-getPressY())+sizesetPressX(e.getX());setPressY(e.getY()} {intx=0;inty=0;intsize=intcount=if(getPressX()>0&&getPressY()>&&e.getX() &&e.getY() {g.setColor( Tool.color);for(inti=0;i<count;i++){x=newRandom().nextInt(size)+1;y=newRandom().nextInt(size)+g.fillRect(e.getX()+x,e.getY()+y,1,1}setPressX(e.getX());setPressY(e.getY()}}坐標(xy)的距離(xnewRandom().nextInt(size)+1ynewRandom().nextInt(size)1),最后當前坐標加上這兩個隨機數(shù),做為新的坐標去畫小矩形。在本章中,噴墨工具對應的是AtomizerTool類,噴墨工具的效果如圖6.11所示。6.11JfileChooserGUIJava實現(xiàn),在不同平臺具有完全的行為,并具有相同的JfileChoosershowOpenDialoggetSelectedFile方法獲取選擇到的文件。然后使用ImageIO的read方法,把文件出來,最后把當前的替換為新讀取到的與調用drawSpace的repaint方法重畫、設置窗口標題,見以下代碼。publicvoidopen(publicvoidopen(ImageFrameframe{save(false,frameFilefile=.2JFileChooserJFileChoosergetCurrentDirectory()方法獲取當前的文件,以這個當前路徑加上文件名做為文件保存的路徑。最后,使用ImageIOwrite方savebooleanb,如果為真,直接保 publicvoidsave(booleanb,ImageFrameframe{if(b)FilecurrentDirectory=StringfileName=BufferedImageimage=null;tryimage=ImageIO.read(file}catch(java.io.IOExceptione{}intwidth=image.getWidth();Tool.drawWidth=width;//創(chuàng)建一個MyImagemyImage=newMyImage(width,,BufferedImage.TYPEINTRGB// 到 畫到myImage上myImage.getGraphics().drawImage(image,0,0,,height,null);,frame.getDrawSpace(),width,height+"-畫圖}.3方法的時候,首先會先調用save方法,詢問是否保存當前正在編輯 ,先做 publicvoidcreateGraphics(ImageFrameframe{save(false,frameintwidth=(int)getScreenSize().getWidth()/2;intheight=Tool.drawWidth=width;Tool.drawHeight=height;//創(chuàng)建一個MyImagemyImage=newMyImage(width,Graphicsg=myImage.getGraphics();g.setColor(Color.WHITE);Stringsuf=StringsavePath=currentDirectory++fileName+"."+try ,newFile(savePath)}catch(java.io.IOExceptionie{}frame.setTitlefileNamesuf畫圖}}elseif(!frame.getBufferedImage().isSaved()) JOptionPaneoption=new//顯示確認保 框intcheckedoption.showConfirmDialog(frame保存改動,if(checked==option.YESOPTION)save(true,frame}}}g.fillRect(g.fillRect(0,0,width,height);,frame.getDrawSpace(),width,heightframe.setTitle畫圖}publicvoideditColor(publicvoideditColor(ImageFrameframe)Colorcolor=編輯顏色Color.BLACKcolor=color==null Tool.color:();}由于我們只會選擇類型的文件,也只會保存為類型的文件,所

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論