Java程序設(shè)計(jì)-12圖形繪制_第1頁(yè)
Java程序設(shè)計(jì)-12圖形繪制_第2頁(yè)
Java程序設(shè)計(jì)-12圖形繪制_第3頁(yè)
Java程序設(shè)計(jì)-12圖形繪制_第4頁(yè)
Java程序設(shè)計(jì)-12圖形繪制_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院趙志崑zhaozk@Java程序設(shè)計(jì)在組件上繪制圖形圖形可以繪制在任意Swing組件上,但一般繪制在面板(JPanel)上,因?yàn)槊姘迨强瞻椎摹@L制圖形需要三步:定義一個(gè)擴(kuò)展自JPanel的新類(lèi);覆蓋其paintComponent方法,將繪圖的語(yǔ)句添加在這個(gè)方法中;創(chuàng)建一個(gè)新類(lèi)的對(duì)象,添加到要顯示的容器中。見(jiàn)PanelExample.javapublicclassPanelExampleextendsJFrame{

……publicPanelExample(){

…… contentPane.add(newMyPanel());}}classMyPanelextendsJPanel{publicvoidpaintComponent(Graphicsg){ //繪圖部分代碼 super.paintComponent(g); g.drawRect(10,10,100,50);}}paintComponent方法此方法是一個(gè)回調(diào)方法,聲明如下:publicvoidpaintComponent(Graphicsg)paintComponent方法在組件需要繪制時(shí)被自動(dòng)調(diào)用:面板首次顯示時(shí);面板尺寸變化時(shí);其它窗口遮住面板時(shí);組件的repaint()方法被調(diào)用時(shí)。paintComponent方法的參數(shù):Graphicsg:繪圖對(duì)象,所有繪圖動(dòng)作都是對(duì)其方法的調(diào)用。g相當(dāng)于一塊畫(huà)布,主要有以下幾類(lèi)方法:繪制簡(jiǎn)單幾何圖形,如矩形、橢圓等;繪制圖像,如圖片;繪制文字;設(shè)置畫(huà)筆屬性,如顏色、文字字體、繪圖模式等。繪制直線voiddrawLine(intx1,inty1,intx2,inty2)繪制一條線。見(jiàn)GraphicsExample.javag.drawLine(10,20,60,50);(x1,y1)(x1,y1)XY繪制矩形voiddrawRect(intx,inty,intwidth,intheight)繪制一個(gè)矩形。voidfillRect(intx,inty,intwidth,intheight)填充一個(gè)矩形。見(jiàn)GraphicsExample.javag.drawRect(10,20,60,50);g.fillRect(80,20,60,50);(x,y)widthheight繪制圓角矩形voiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)繪制一個(gè)圓角矩形voidfillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)填充一個(gè)圓角矩形(x,y)widthheight見(jiàn)GraphicsExample.javag.drawRoundRect(10,10,100,50,20,15);g.fillRoundRect(160,10,100,50,20,15);arcHeightarcWidth繪制橢圓voiddrawOval(intx,inty,intwidth,intheight)繪制一個(gè)橢圓voidfillOval(intx,inty,intwidth,intheight)填充一個(gè)橢圓(x,y)widthheight見(jiàn)GraphicsExample.javag.drawOval(10,10,100,50);g.fillOval(160,10,100,50);繪制弧線voiddrawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)繪制一條弧。voidfillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)填充一個(gè)扇形。見(jiàn)GraphicsExample.javag.drawArc(10,10,100,50,0,60);g.fillArc(160,10,100,50,0,60);(x,y)widthheightstartAnglearcAngle繪制多邊形voiddrawPolygon(Polygonp)繪制一個(gè)多邊形voidfillPolygon(Polygonp)填充一個(gè)多邊形見(jiàn)GraphicsExample.javaPolygonp=newPolygon();p.addPoint(10,10);p.addPoint(100,30);p.addPoint(50,50);p.addPoint(100,70);p.addPoint(30,100);g.drawPolygon(p);p.translate(150,0);g.fillPolygon(p);(10,10)(100,30)(50,50)(100,70)(30,100)150設(shè)置顏色voidsetColor(Colorc):將當(dāng)前畫(huà)筆顏色設(shè)置為c。ColorgetColor():讀取當(dāng)前畫(huà)筆顏色。顏色的構(gòu)造:構(gòu)造函數(shù)Color(intr,intg,intb):參數(shù)為紅、綠、藍(lán)的值(0-255)。直接使用Color類(lèi)中的靜態(tài)對(duì)象:如Color.blue,Color.yellow,Color.orange,……見(jiàn)ColorExample.javaintred=0;intgreen=0;intblue=0;intgray=0;for(red=0;red<=255;red+=16){ g.setColor(newColor(red,green,blue)); g.fillRect(red+16,16,15,15);}……輸出文字將字符串輸出到特定位置:voiddrawString(Stringstr,intx,inty)(x,y)見(jiàn)TextExample.javag.drawString("HelloWorld!",50,50);g.drawString("世界你好!",50,100);設(shè)置字體設(shè)置當(dāng)前字體:voidsetFont(Fontfont)獲取當(dāng)前字體:FontgetFont()Font的構(gòu)造器:Font(Stringname,intstyle,intsize)name:字體名稱(chēng),可以用下面的方法獲取系統(tǒng)支持的所有字體:String[]GraphicsEnvironment.getLocalGraphicsEnvironment(). getAvailableFontFamilyNames()style:字體形式,為Font.PLAIN,F(xiàn)ont.BOLD,F(xiàn)ont.ITALIC。size:字體的高度,單位為像素。這些設(shè)置字體的方法同樣可以應(yīng)用于組件上顯示的字體。見(jiàn)FontExample.javapublicvoidpaintComponent(Graphicsg){ super.paintComponent(g); g.setFont(newFont(fontName,fontStyle,fontSize)); g.drawString("HelloWorld!",50,50); g.drawString("世界你好!",50,100);}見(jiàn)ImageExample.javaclassImagePanelextendsJPanel{ privateImageunitsImage=null; privateintunitX; privateintunitY; publicImagePanel(){ Toolkitkit=Toolkit.getDefaultToolkit(); unitsImage=kit.getImage("globe.gif"); } publicvoidpaintComponent(Graphicsg){ super.paintComponent(g); g.drawRect(10,10,100,100); g.drawImage(unitsImage,unitX,unitY,null); } publicvoidsetUnitLocation(intaX,intaY){ unitX=aX; unitY=aY; repaint(); }}繪制圖像-1drawImage(Imageimg,intdx,intdy,ImageObserverobserver)將img中圖片繪制到當(dāng)前畫(huà)布。globe.gifunitsImage見(jiàn)ImageExample1.javapublicvoidpaintComponent(Graphicsg){

…… intsx1=118*unitIndex; intsy1=0; intsx2=sx1+117; intsy2=sy1+97; intdx1=unitX; intdy1=unitY; intdx2=dx1+117; intdy2=dy1+97; g.drawImage(unitsImage,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,null);}publicvoidsetUnitLocation(intaX,intaY){

……

unitIndex=(unitIndex+1)%4; repaint();}繪制圖像-2drawImage(Imageimg,intdx1,intdy1,intdx2,intdy2,intsx1,intsy1,intsx2,intsy2,ImageObserverobserver)將img中的一個(gè)矩形區(qū)域繪制到當(dāng)前畫(huà)布的一個(gè)矩形區(qū)域,且可拉伸。透明的部分不繪制(gif圖片可以指定一個(gè)透明色),用于繪制不規(guī)則圖像。unitsImageduke.gif(dx1,dy1)(dx2,dy2)(sx1,sy1)0123(sx2,sy2)11898等待圖像加載問(wèn)題:Java加載圖片文件(kit.getImage)的時(shí)候,采用異步的方式,即圖片文件可能還沒(méi)有加載完,getImage方法就返回了。這是為了適應(yīng)網(wǎng)絡(luò)速度慢下加載圖片的時(shí)間比較長(zhǎng)的情況。此時(shí),如果使用圖片的數(shù)據(jù),則是錯(cuò)誤的。因此需要一種機(jī)制等待圖片加載完成。解決:Java采用一個(gè)MediaTracker來(lái)跟蹤圖片的加載過(guò)程。見(jiàn)ImageExample1.javapublicImagePanel(){ Toolkitkit=Toolkit.getDefaultToolkit(); unitsImage=kit.getImage("duke.gif");

MediaTrackertracker=newMediaTracker(this); tracker.addImage(unitsImage,0); try{ tracker.waitForID(0); }catch(Exceptione) { System.out.println(e); }}使用MediaTracker的方法:1、創(chuàng)建一個(gè)MediaTracker對(duì)象;2、用addImage方法將正在裝入的圖片加入到MediaTracker對(duì)象,并賦予一個(gè)編號(hào);3、用waitForID(編號(hào))方法等待圖片裝入完成。Java支持的圖片格式Java支持三種圖片格式:JPEG:JointPhotographicExpertsGroup,支持全24位色彩。它是通過(guò)精確地記錄每個(gè)像素的光亮但同時(shí)平均它們的色調(diào)的方法壓縮圖片,是有損壓縮。GIF:GraphicsInterchangeFormat,采用顏色索引的方式存儲(chǔ)圖片。一個(gè)GIF圖片中只能有不多于256種的色彩,因此無(wú)法存儲(chǔ)高質(zhì)量照片。一個(gè)GIF文件可以包含幾張圖形以及每張圖形的持續(xù)值,以產(chǎn)生動(dòng)畫(huà)效果。它也有有限度的可透明性:調(diào)色板中的某個(gè)色彩可被指定為透明色。

PNG:PortableNetworkGraphics,無(wú)損壓縮,適合在網(wǎng)絡(luò)中傳播;具有8位、24位和32位三中色彩深度;支持Alpha通道透明(32位)和色彩索引透明(8位)。Graphics2DGraphics類(lèi)是一個(gè)抽象類(lèi),所以paintComponent(Graphicsg)方法中的參數(shù)g不可能是一個(gè)Graphics類(lèi)型的對(duì)象。參數(shù)g實(shí)際上是Graphics的子類(lèi)Graphics2D類(lèi)型的對(duì)象。Graphics2D類(lèi)提供的功能比Graphics類(lèi)強(qiáng)大,包括:支持繪制更復(fù)雜的形狀,如二次曲線、三次曲線;支持更復(fù)雜的坐標(biāo)變換,如旋轉(zhuǎn)等;支持設(shè)置線型,如實(shí)線、虛線、線條粗細(xì);支持更復(fù)雜的填充方法,如多種顏色著色。要使用Graphics2D類(lèi)的功能時(shí),可以直接進(jìn)行造型。publicvoidpaintComponent(Graphicsg){ super.paintComponent(g); Graphics2Dg2=(Graphics2D)g;

…… //g2支持Graphics2D類(lèi)的所有方法}緩沖區(qū)繪圖問(wèn)題:Graphics類(lèi)沒(méi)有能夠取得某一點(diǎn)的顏色的方法。組件沒(méi)有將圖片保存到文件的方法。解決:BufferedImage類(lèi)(Image類(lèi)的子類(lèi))有取色功能(getRGB方法)和保存到文件功能。采用雙緩沖區(qū)繪圖的方法,將BufferedImage和JPanel聯(lián)系起來(lái):創(chuàng)建一個(gè)BufferedImage對(duì)象,作為后臺(tái)繪圖緩沖區(qū);所有繪圖操作均在BufferedImage對(duì)象上進(jìn)行;繪制完成后,將BufferedImage對(duì)象整個(gè)繪制到JPanel上;這樣,BufferedImage對(duì)象和JPanel的圖像將完全一樣。globe.gif(文件)unitImage(Image)backBuffer(BufferedImage)Graphicsg(JPanel的paintComponent方法)見(jiàn)DoubleBufferExample.javaclassPhotoPanelextendsJPanel{privateBufferedImagebackImage=newBufferedImage(1024,800, BufferedImage.TYPE_BYTE_INDEXED);publicvoidpaintComponent(Graphicsg){ super.paintComponent(g); GraphicsbackG=backImage.getGraphics(); backG.drawImage(photoImage,0,0,null); g.drawImage(backImage,0,0,null); backG.dispose();}publicColorgetColor(intx,inty){ intc=backImage.getRGB(x,y); returnnewColor(c);}}讀取圖像數(shù)據(jù)采用雙緩沖區(qū)繪圖的方法后,將BufferedImage和JPanel的圖像完全相同。因此,若想從JPanel某個(gè)位置取色,可以直接從Buffered

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論