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

下載本文檔

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

文檔簡介

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

……publicPanelExample(){

…… contentPane.add(newMyPanel());}}classMyPanelextendsJPanel{publicvoidpaintComponent(Graphicsg){ //繪圖部分代碼 super.paintComponent(g); g.drawRect(10,10,100,50);}}paintComponent方法此方法是一個回調(diào)方法,聲明如下:publicvoidpaintComponent(Graphicsg)paintComponent方法在組件需要繪制時被自動調(diào)用:面板首次顯示時;面板尺寸變化時;其它窗口遮住面板時;組件的repaint()方法被調(diào)用時。paintComponent方法的參數(shù):Graphicsg:繪圖對象,所有繪圖動作都是對其方法的調(diào)用。g相當(dāng)于一塊畫布,主要有以下幾類方法:繪制簡單幾何圖形,如矩形、橢圓等;繪制圖像,如圖片;繪制文字;設(shè)置畫筆屬性,如顏色、文字字體、繪圖模式等。繪制直線voiddrawLine(intx1,inty1,intx2,inty2)繪制一條線。見GraphicsExample.javag.drawLine(10,20,60,50);(x1,y1)(x1,y1)XY繪制矩形voiddrawRect(intx,inty,intwidth,intheight)繪制一個矩形。voidfillRect(intx,inty,intwidth,intheight)填充一個矩形。見GraphicsExample.javag.drawRect(10,20,60,50);g.fillRect(80,20,60,50);(x,y)widthheight繪制圓角矩形voiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)繪制一個圓角矩形voidfillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)填充一個圓角矩形(x,y)widthheight見GraphicsExample.javag.drawRoundRect(10,10,100,50,20,15);g.fillRoundRect(160,10,100,50,20,15);arcHeightarcWidth繪制橢圓voiddrawOval(intx,inty,intwidth,intheight)繪制一個橢圓voidfillOval(intx,inty,intwidth,intheight)填充一個橢圓(x,y)widthheight見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)填充一個扇形。見GraphicsExample.javag.drawArc(10,10,100,50,0,60);g.fillArc(160,10,100,50,0,60);(x,y)widthheightstartAnglearcAngle繪制多邊形voiddrawPolygon(Polygonp)繪制一個多邊形voidfillPolygon(Polygonp)填充一個多邊形見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)前畫筆顏色設(shè)置為c。ColorgetColor():讀取當(dāng)前畫筆顏色。顏色的構(gòu)造:構(gòu)造函數(shù)Color(intr,intg,intb):參數(shù)為紅、綠、藍(lán)的值(0-255)。直接使用Color類中的靜態(tài)對象:如Color.blue,Color.yellow,Color.orange,……見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)見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:字體名稱,可以用下面的方法獲取系統(tǒng)支持的所有字體:String[]GraphicsEnvironment.getLocalGraphicsEnvironment(). getAvailableFontFamilyNames()style:字體形式,為Font.PLAIN,F(xiàn)ont.BOLD,F(xiàn)ont.ITALIC。size:字體的高度,單位為像素。這些設(shè)置字體的方法同樣可以應(yīng)用于組件上顯示的字體。見FontExample.javapublicvoidpaintComponent(Graphicsg){ super.paintComponent(g); g.setFont(newFont(fontName,fontStyle,fontSize)); g.drawString("HelloWorld!",50,50); g.drawString("世界你好!",50,100);}見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)前畫布。globe.gifunitsImage見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中的一個矩形區(qū)域繪制到當(dāng)前畫布的一個矩形區(qū)域,且可拉伸。透明的部分不繪制(gif圖片可以指定一個透明色),用于繪制不規(guī)則圖像。unitsImageduke.gif(dx1,dy1)(dx2,dy2)(sx1,sy1)0123(sx2,sy2)11898等待圖像加載問題:Java加載圖片文件(kit.getImage)的時候,采用異步的方式,即圖片文件可能還沒有加載完,getImage方法就返回了。這是為了適應(yīng)網(wǎng)絡(luò)速度慢下加載圖片的時間比較長的情況。此時,如果使用圖片的數(shù)據(jù),則是錯誤的。因此需要一種機(jī)制等待圖片加載完成。解決:Java采用一個MediaTracker來跟蹤圖片的加載過程。見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)建一個MediaTracker對象;2、用addImage方法將正在裝入的圖片加入到MediaTracker對象,并賦予一個編號;3、用waitForID(編號)方法等待圖片裝入完成。Java支持的圖片格式Java支持三種圖片格式:JPEG:JointPhotographicExpertsGroup,支持全24位色彩。它是通過精確地記錄每個像素的光亮但同時平均它們的色調(diào)的方法壓縮圖片,是有損壓縮。GIF:GraphicsInterchangeFormat,采用顏色索引的方式存儲圖片。一個GIF圖片中只能有不多于256種的色彩,因此無法存儲高質(zhì)量照片。一個GIF文件可以包含幾張圖形以及每張圖形的持續(xù)值,以產(chǎn)生動畫效果。它也有有限度的可透明性:調(diào)色板中的某個色彩可被指定為透明色。

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

…… //g2支持Graphics2D類的所有方法}緩沖區(qū)繪圖問題:Graphics類沒有能夠取得某一點(diǎn)的顏色的方法。組件沒有將圖片保存到文件的方法。解決:BufferedImage類(Image類的子類)有取色功能(getRGB方法)和保存到文件功能。采用雙緩沖區(qū)繪圖的方法,將BufferedImage和JPanel聯(lián)系起來:創(chuàng)建一個BufferedImage對象,作為后臺繪圖緩沖區(qū);所有繪圖操作均在BufferedImage對象上進(jìn)行;繪制完成后,將BufferedImage對象整個繪制到JPanel上;這樣,BufferedImage對象和JPanel的圖像將完全一樣。globe.gif(文件)unitImage(Image)backBuffer(BufferedImage)Graphicsg(JPanel的paintComponent方法)見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某個位置取色,可以直接從Buffered

溫馨提示

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

評論

0/150

提交評論