版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java繪圖5.1Java圖形5.2Paint方法、Update方法和Repaint方法5.3Graphics類5.4Color類5.5Graphics2D類習題
5.1Java圖形抽象窗口化工具(AWT)為圖形用戶界面編程提供API編程接口,使得Java可以提供較好的圖形用戶界面。AWT把圖形處理分為兩個層次:一是處理原始圖形,這一層較原始,圖形直接以點、線和面的形式畫到界面上;二是提供大量組件,實現(xiàn)可定制的圖形用戶界面。本章主要討論如何在界面上畫圖形及所畫圖形的特征。Java編程語言中的圖形坐標系統(tǒng)不同于數(shù)學中的坐標系,屏幕左上角為(0,0),右下角為屏幕水平向右和垂直向下增長的像素數(shù)。5.2Paint方法、Update方法和Repaint方法
1.Paint方法publicvoidpaint(Graphicsg)以畫布為參數(shù),在畫布上執(zhí)行畫圖方法。在Applet中,不顯式地調用paint方法。
2.Repaint方法Applet重畫時系統(tǒng)自動調用paint方法。
3.Update方法publicvoidupdate(Graphicsg)更新容器,向Repaint發(fā)出刷新小應用程序的信號,缺省的Update方法清除Applet畫圖區(qū)并調用Paint方法。5.3Graphics類Graphics類是所有圖形上下文的抽象基類,允許應用程序在各種設備上實現(xiàn)組件的畫圖。圖形對象封裝了Java支持的基本渲染操作的狀態(tài)信息,包括畫圖的組件對象、渲染區(qū)域的坐標(coordinates)、區(qū)域(clip)、顏色(color)、字體(font)、畫圖模式等。Graphics類提供畫各種圖形的方法,其中包括線、圓和橢圓、矩形和多邊形、圖像以及各種字體的文本等。這些方法具體如下:publicabstractvoidclipRect(intx,inty,intwidth,intheight)指定的區(qū)域切分。publicabstractvoiddrawLine(intx1,inty1,intx2,inty2)使用當前顏色,在點(x1,y1)和(x2,y2)之間畫線。publicabstractvoiddrawOval(intx,inty,intwidth,intheight)畫橢圓。publicabstractvoidfillOval(intx,inty,intwidth,intheight)畫實心橢圓。publicabstractvoiddrawPolygon(int[]xPoints,int[]yPoints,intnPoints)畫x和y坐標定義的多邊形。publicvoiddrawRect(intx,inty,intwidth,intheight)畫矩形。publicvoiddrawRect(intx,inty,intwidth,intheight)畫實心矩形。publicabstractvoiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)使用當前顏色畫圓角矩形。publicabstractvoiddrawString(Stringstr,intx,inty)使用當前字體和顏色畫字符串str。publicabstractvoidsetColor(Colorc)設置圖形上下文的當前顏色。publicabstractvoidsetPaintMode()設置畫模式。publicabstractbooleandrawImage(Imageimg,intx,inty,ImageObserverobserver)畫特定圖。publicabstractvoidsetFont(Fontfont)設置特定的font字體。使用時首先得到font對象的一個實例,F(xiàn)ont類常用構造函數(shù)為:publicFont(Stringname,intstyle,intsize)通過指定的name、style和size創(chuàng)建字體實例。name指字體名,像“隸書”、“TimesRoman”等,字體風格為粗體、斜體,size指字號大小。例如:Fontf=newFont("TimesRoman",Font.BOLD+Font.ITALIC,12);創(chuàng)建了具有粗斜體風格的12磅的TimesRoman字體?!纠?.1】設置Graphics對象畫圖,顯示結果如圖5.1所示。源程序代碼如下://程序文件名SimpleGUI.javaimportjava.awt.*;importjava.applet.*;publicclassSimpleGUIextendsApplet{ ImagesamImage; publicvoidinit() { samImage=getImage(getDocumentBase(),"sample.gif");} publicvoidpaint(Graphicsg){ //g.clipRect(50,50,180,180); //畫線 g.drawLine(0,0,20,30); //輸出字符串 g.drawString("圖形顯示",100,30); //設置顏色 Colorc=newColor(255,200,0); g.setColor(c); //設置字體Fontf=newFont("TimesRoman",Font.BOLD+Font.ITALIC,24);g.setFont(f);g.drawString("圖形顯示",180,30);g.drawLine(20,20,100,50);g.drawLine(20,20,50,100);//矩形g.drawRect(40,40,40,40);g.fillRect(60,60,40,40);g.setColor(Color.red);//3D矩形g.draw3DRect(80,80,40,40,true);g.draw3DRect(100,100,40,40,false);g.fill3DRect(120,120,40,40,true);//橢圓g.drawOval(150,150,30,40);g.fillOval(170,170,20,20);g.setColor(Color.blue);//圓角矩形g.drawRoundRect(180,180,40,40,20,20);g.fillRoundRect(200,200,40,40,20,20);//多邊形intxC[]={242,260,254,297,242};intyC[]={240,243,290,300,270};g.drawPolygon(xC,yC,5);//圖片g.drawImage(samImage,250,50,this); }}圖5.1簡單的圖形界面將例5.1注釋的程序語句//g.clipRect(50,50,180,180);的注釋符號去掉,重新編譯執(zhí)行,可以看見如圖5.2所示的結果。圖5.2裁剪后的圖形界面5.4Color類Color類是用來封裝顏色的,在上面的例子中多次用到。使用Color對象較為簡單的方法是直接使用Color類提供的預定義的顏色,像紅色Color.red、橙色Color.orange等;也可以使用RGB顏色模式進行定義。所謂RGB顏色模式是指使用三種基色:紅、綠、藍,通過三種顏色的調整得出其它各種顏色,這三種基色的值范圍為0~255。例如Colorc=newColor(255,200,0);定義橙色。表5.1給出常用顏色的RGB值以及對應的類預定義參數(shù)。表5.1常用顏色的RGB值以及對應的類預定義參數(shù)Color還有一個構造函數(shù),它構造的Color對象用于是否透明顯示顏色。publicColor(intred,intgreen,intblue,intalpha)其中:前三個分量即RGB顏色模式中的參數(shù),第四個alpha分量指透明的程度。當alpha分量為255時,表示完全不透明,正常顯示;當alpha分量為0時,表示完全透明,前三個分量不起作用,而介于0~255之間的值可以制造出顏色不同的層次效果?!纠?.2】測試Color對象,界面如圖5.3所示。源程序代碼如下://程序文件名UseColor.javaimportjava.awt.*;importjava.applet.*;importjava.awt.geom.*;publicclassUseColorextendsApplet{ publicvoidpaint(Graphicsoldg) { Graphics2Dg=(Graphics2D)oldg; g.setColor(Color.blue); g.fill(newEllipse2D.Float(50,50,150,150)); g.setColor(newColor(255,0,0,0)); g.fill(newEllipse2D.Float(50,50,140,140)); g.setColor(newColor(255,0,0,64)); g.fill(newEllipse2D.Float(50,50,130,130)); g.setColor(newColor(255,0,0,128)); g.fill(newEllipse2D.Float(50,50,110,110)); g.setColor(newColor(255,0,0,255)); g.fill(newEllipse2D.Float(50,50,90,90)); g.setColor(newColor(255,200,0)); g.fill(newEllipse2D.Float(50,50,70,70)); }}圖5.3顏色測試界面5.5Graphics2D類Graphics2D類繼承于Graphics類,提供幾何學、坐標變換、顏色管理以及文本排列等的更高級控制。Graphics2D類是Java平臺上渲染二維圖形、文字、以及圖片的基礎類,提供較好的對繪制形狀、填充形狀、旋轉形狀、繪制文本、繪制圖像以及定義顏色的支持。在AWT編程接口中,用戶通過Paint方法接收Graphics對象作為參數(shù),若是使用Graphics2D類,就需要在Paint方法中進行強制轉換。Publicvoidpaint(Graphicsold){ Graphics2Dnew=(Graphics2D)old;}5.5.1繪制形狀Graphics2D提供以下兩個方法進行形狀的繪制:publicabstractvoiddraw(Shapes)根據(jù)Graphics2D的環(huán)境設置畫出形狀s,其中Shape接口包含的類如表5.2所示。publicabstractvoidfill(Shapes)畫實心形狀s。表5.2Graphics2D繪制的圖形類其中GeneralPath是一般的幾何路徑,它的構造函數(shù)為:publicGeneralPath()構造一個空的對象。常用的方法有四個,分別如下:publicvoidlineTo(floatx,floaty)從當前坐標點到(x,y)坐標點畫一條直線,將此點添加到路徑上。publicvoidmoveTo(floatx,floaty)移動到坐標點(x,y),在路徑上添加此點。publicvoidquadTo(floatx1,floaty1,floatx2,floaty2)以坐標點(x1,y1)為控制點,在當前坐標點和坐標點(x2,y2)之間插入二次曲線片斷。publicvoidcurveTo(floatx1,floaty1,floatx2,floaty2,floatx3,floaty3)以(x1,y1)和(x2,y2)為控制點,在當前坐標點和(x3,y3)之間插入曲線片斷。在Draw方法中提到Graphics2D的環(huán)境設置。所謂的環(huán)境設置是指設置畫圖的筆畫和填充屬性等,設置方法分別如下:publicabstractvoidsetStroke(Strokes)設置筆畫的粗細。其中Stroke接口中常用BasicStroke類來實現(xiàn),一個較簡單的構造函數(shù)為publicBasicStroke(floatwidth)創(chuàng)建實線筆畫寬度為width。publicabstractvoidsetPaint(Paintpaint)設置Graphics2D環(huán)境的填充屬性。其中,paint的值可以為漸變填充類java.awt.GradientPaint,也可以為圖形填充類java.awt.TexturePaint,后者將在5.5.3節(jié)繪制圖像中講到。漸變填充類常用構造函數(shù)為publicGradientPaint(floatx1,floaty1,Colorcolor1,floatx2,floaty2,Colorcolor2,booleancyclic)構建一個漸變GradientPaint對象,在起始坐標點到目標坐標點之間從顏色color1到color2漸變,cyclic為真,循環(huán)漸變?!纠?.3】演示了幾何形狀、筆畫變換以及顏色漸變顯示。其中直線的筆畫寬度為10,其它筆畫寬度為5,中間三個圖形實現(xiàn)綠色到藍色的循環(huán)漸變,后三個圖形實現(xiàn)紅色到黃色的循環(huán)漸變,如圖5.4所示。//程序文件名GUI2D.javaimportjava.awt.*;importjava.applet.*;importjava.awt.geom.*;publicclassGUI2DextendsApplet{ publicvoidpaint(Graphicsoldg) { Graphics2Dg=(Graphics2D)oldg; //設置筆畫寬度 BasicStrokestroke=newBasicStroke(10); g.setStroke(stroke); //畫線 Line2Dline=newLine2D.Float(0,0,20,30); g.draw(line); line=newLine2D.Float(50,50,100,50); g.draw(line); line=newLine2D.Float(50,50,50,100); g.draw(line); stroke=newBasicStroke(5); g.setStroke(stroke); //設置漸變填充 GradientPaintgt=newGradientPaint(0,0,Color.green,50,30,Color.blue,true); g.setPaint((Paint)gt); //畫矩形 Rectangle2Drect=newRectangle2D.Float(80,80,40,40); g.draw(rect); rect=newRectangle2D.Float(100,100,40,40); g.fill(rect); //畫橢圓 Ellipse2Dellipse=newEllipse2D.Float(120,120,30,40); g.draw(ellipse); gt=newGradientPaint(0,0,Color.red,30,30,Color.yellow,true); g.setPaint((Paint)gt); ellipse=newEllipse2D.Float(140,140,20,20); g.fill(ellipse); //畫圓角矩形 RoundRectangle2DroundRect=newRoundRectangle2D.Float(160,160,40,40,20,20); g.draw(roundRect); roundRect=newRoundRectangle2D.Float(180,180,40,40,20,20); g.fill(roundRect); //畫幾何圖形 GeneralPathpath=newGeneralPath(); path.moveTo(150,0); path.lineTo(160,50); path.curveTo(190,200,240,140,200,100); g.fill(path);}}圖5.4通過Graphics2D對象繪制形狀5.5.2繪制文本Graphics2D類提供一個文本布局(TextLayout)對象,用于實現(xiàn)各種字體或段落文本的繪制。其構造函數(shù)為:publicTextLayout(Stringstring,Fontfont,FontRenderContextfrc)通過字符串string和字體font構造布局。publicvoiddraw(Graphics2Dg2,floatx,floaty)將這個TextLayout對象畫到Graphics2D對象g2上的x,y坐標處。publicRectangle2DgetBounds()返回TextLayout對象的區(qū)域?!纠?.4】測試繪制文本功能,如圖5.5所示。源程序代碼如下://程序文件GUIText.javaimportjava.awt.*;importjava.applet.*;importjava.awt.geom.*;importjava.awt.font.*;publicclassGUITextextendsApplet{ publicvoidpaint(Graphicsoldg) { Graphics2Dg=(Graphics2D)oldg; //設置字體 Fontf1=newFont("Courier",Font.PLAIN,24); Fontf2=newFont("helvetica",Font.BOLD,24); FontRenderContextfrc=g.getFontRenderContext(); Stringstr=newString("這是一個文本布局類的實現(xiàn)"); Stringstr2=newString("擴充繪制文本的功能"); //構造文本布局對象 TextLayoutlayout=newTextLayout(str,f1,frc); Point2Dloc=newPoint2D.Float(20,50); //繪制文本 layout.draw(g,(float)loc.getX(),(float)loc.getY()); //設置邊框 Rectangle2Dbounds=layout.getBounds(); bounds.setRect(bounds.getX()+loc.getX(), bounds.getY()+loc.getY(), bounds.getWidth(), bounds.getHeight()); g.draw(bounds); layout=newTextLayout(str2,f2,frc); g.setColor(Color.red); layout.draw(g,20,80);}}圖5.5Graphics2D對象繪制文本5.5.3繪制圖像繪制圖像用到BufferedImage類,BufferedImage類是指存放圖像數(shù)據(jù)的可訪問的緩沖。其構造函數(shù)為:publicBufferedImage(intwidth,intheight,intimageType)使用寬度(width)、高度(height)和imageType類型構造BufferedImage對象。publicGraphics2DcreateGraphics()用圖片填充橢圓的具體過程如下:(1)創(chuàng)建一個Graphics2D,可以畫到BufferedImage中。例如構建一個BufferedImage對象buf。BufferedImagebuf=newBufferedImage(img.getWidth(this),img.getHeight(this),BufferedImage.TYPE_INT_ARGB);創(chuàng)建一個臨時Graphics2D對象:GraphicstmpG=buf.createGraphics();將圖像畫入臨時緩沖:tmpG.drawImage(img,10,10,this);(2)用TexturePaint類進行填充:publicTexturePaint(BufferedImagetxtr,Rectangle2Danchor)構造TexturePaint對象,需要一個Rectangle2D對象來存放該對象:Rectangle2Drect=newRectangle2D.Float(0,0,h,w);TexturePaintt=newTexturePaint(buf,rect);(3)然后設置填充模式,并進行填充:g.setPaint(t);g.fill(newEllipse2D.Float(100,50,60,60));【例5.5】完成圖像顯示,并將區(qū)域藍色透明顯示,然后進行圖片填充,如圖5.6所示。源程序代碼如下://程序文件名GUIImage.javaimportjava.awt.*;importjava.applet.*;importjava.awt.geom.*;importjava.awt.font.*;importjava.awt.image.*;.*;publicclassGUIImageextendsApplet{publicvoidpaint(Graphicsoldg){ Graphics2Dg=(Graphics2D)oldg; try {
URLimgURL=newURL(getDo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《營銷法規(guī)實務》課件
- 養(yǎng)老院老人入住審批制度
- 養(yǎng)老院緊急救援制度
- 復習統(tǒng)計初步課件
- 2024年專用:20xx境外合資合同3篇
- 救護車掛靠私立醫(yī)院協(xié)議書(2篇)
- 《血透患教》課件
- 2024年環(huán)保材料研發(fā)與生產(chǎn)許可合同
- 2024年民間個人借貸協(xié)議范本集錦一
- 2024年版自駕游活動安全責任合同版B版
- 中國特色社會主義理論與實踐復習資料-研究生
- 2023年高級電氣工程師年終總結及年后展望
- 護理差錯登記表(科室表)
- 評職稱育人工作總結(通用12篇)
- 數(shù)據(jù)保密協(xié)議書
- 高考英語詞匯3500電子版
- 《網(wǎng)絡文學概述》課件
- GB/T 3880.1-2023一般工業(yè)用鋁及鋁合金板、帶材第1部分:一般要求
- GB/T 2965-2023鈦及鈦合金棒材
- 實習單位鑒定表(模板)
- 讀書交流PPT(我這樣教數(shù)學-華應龍課堂實錄讀書心得)
評論
0/150
提交評論