第9章-文字與圖形GUI設(shè)計(jì)課件_第1頁(yè)
第9章-文字與圖形GUI設(shè)計(jì)課件_第2頁(yè)
第9章-文字與圖形GUI設(shè)計(jì)課件_第3頁(yè)
第9章-文字與圖形GUI設(shè)計(jì)課件_第4頁(yè)
第9章-文字與圖形GUI設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩95頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第9章 文字與圖形GUI設(shè)計(jì)9.1 GUI設(shè)計(jì)概述9.2 繪制文字9.3 Color類(lèi)9.4 繪制形狀圖形習(xí)題9 9.1 GUI設(shè)計(jì)概述 圖形用戶界面(Graphics User Interface,簡(jiǎn)稱(chēng)GUI)就是為應(yīng)用程序提供一個(gè)圖形化的界面。GUI使用圖形的方式借助菜單、按鈕等標(biāo)準(zhǔn)界面元素和鼠標(biāo)操作,幫助用戶方便地向計(jì)算機(jī)系統(tǒng)發(fā)出命令、啟動(dòng)操作,并將系統(tǒng)運(yùn)行的結(jié)果同樣以圖形的方式顯示給用戶,使一個(gè)應(yīng)用程序具有畫(huà)面生動(dòng)、操作簡(jiǎn)便的效果,省去了字符界面中用戶必須記憶各種命令的麻煩,深受廣大用戶的喜愛(ài)和歡迎,已經(jīng)成為目前幾乎所有應(yīng)用軟件的既成標(biāo)準(zhǔn)。 為了方便編程人員開(kāi)發(fā)圖形用戶界面,Java提

2、供了抽象窗口工具包(Abstract Windowing ToolKit,縮寫(xiě)為AWT)和Swing包這兩個(gè)圖形用戶界面工具包。在這兩個(gè)工具包中提供了豐富的類(lèi)庫(kù)來(lái)支持編程人員創(chuàng)建與平臺(tái)無(wú)關(guān)的用戶界面。編程人員可方便地使用這些類(lèi)庫(kù)來(lái)生成各種標(biāo)準(zhǔn)圖形界面元素并處理圖形界面的各種事件。9.1.1 圖形用戶界面元素分類(lèi) 1容器 容器是用來(lái)組織或容納其他界面成分和元素的組件。一個(gè)容器可以包含許多組件,同時(shí)它本身也可以作為一個(gè)組件,放進(jìn)另一容器中。一般來(lái)說(shuō),一個(gè)應(yīng)用程序的圖形用戶界面首先對(duì)應(yīng)于一個(gè)復(fù)雜的容器,例如一個(gè)窗口。這個(gè)容器內(nèi)部將包含許多界面成分和元素,其中某些界面元素本身也可能又是一個(gè)容器,這個(gè)容

3、器再進(jìn)一步包含它的界面成分和元素,依此類(lèi)推就構(gòu)成一個(gè)復(fù)雜的圖形界面系統(tǒng)。 容器是Java中的類(lèi),例如框架(JFrame)、面版(JPanel)及滾動(dòng)面板(JScrollPanel)等類(lèi)。容器的引入有利于分解圖形用戶界面的復(fù)雜性。當(dāng)界面的功能較多時(shí),使用層層相套的容器是非常必要的。 2控制組件 與容器不同,控制組件是圖形用戶界面的最小單位之一,它里面不再包含其他的成分??刂平M件的作用是完成與用戶的一次交互,包括接收用戶的一個(gè)命令(如菜單命令),接收用戶輸入的一個(gè)文本或選擇,向用戶顯示一段文本或一個(gè)圖形等等。 從某種程度上來(lái)說(shuō),控制組件是圖形用戶界面標(biāo)準(zhǔn)化的結(jié)果,目前常用的控制組件有選擇類(lèi)的單選按

4、鈕、復(fù)選按鈕、下拉列表,有文字處理類(lèi)的文本框、文本區(qū)域,有命令類(lèi)的按鈕、菜單等。使用控制組件,通常需要如下的步驟: (1) 創(chuàng)建某控制組件類(lèi)的對(duì)象,指定其大小等屬性。 (2) 使用某種布局策略,將該控制組件對(duì)象加入到某個(gè)容器中的指定位置處。 (3) 將該組件對(duì)象注冊(cè)給所能產(chǎn)生的事件對(duì)應(yīng)的事件監(jiān)聽(tīng)程序,重載事件處理方法,實(shí)現(xiàn)利用該組件對(duì)象與用戶交互的功能。 3用戶自定義成分 除了上述的標(biāo)準(zhǔn)圖形界面元素外,編程人員還可以根據(jù)用戶的需要,使用各種字型、字體和色彩設(shè)計(jì)一些幾何圖形、標(biāo)志圖案等,它們被稱(chēng)為用戶自定義成分。用戶自定義成分通常只能起到裝飾、美化的作用,而不能響應(yīng)用戶的動(dòng)作,也不具有交互功能。

5、 由于用戶自定義成分易于學(xué)習(xí)和掌握,同時(shí),各種基本圖形和說(shuō)明性文字又是容器和控制組件的基本成分,而且考慮到由淺入深的學(xué)習(xí)規(guī)律,因此我們先在本章利用AWT包學(xué)習(xí)用戶自定義成分,在第9章和第10章再學(xué)習(xí)控制組件和復(fù)雜的容器。9.1.2 Applet的執(zhí)行程序 Applet是一種執(zhí)行于Web瀏覽器的小程序,是通過(guò)應(yīng)用程序架構(gòu)開(kāi)發(fā)而得到的。在我們編寫(xiě)Web瀏覽器程序時(shí),我們必須繼承class Applet或class JApplet,必須覆蓋必要的Applet 的成員方法,這些成員方法控制了Web頁(yè)面上的applet的生成與執(zhí)行。為此,有必要先介紹Applet應(yīng)用程序的執(zhí)行過(guò)程及其所引用的方法。我們編

6、寫(xiě)的每個(gè)Applet小程序都是Applet類(lèi)的子類(lèi),在實(shí)際運(yùn)行中,瀏覽器在下載字節(jié)碼的同時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè)用戶Applet子類(lèi)的對(duì)象,并在適當(dāng)事件發(fā)生時(shí)自動(dòng)調(diào)用該對(duì)象的幾個(gè)主要方法。下面說(shuō)明這些方法及其引用過(guò)程。 (1) init( )方法。當(dāng)Applet程序啟動(dòng)時(shí)自動(dòng)調(diào)用init( )方法。init ( )方法僅用來(lái)做初始化操作。用戶程序可以重載父類(lèi)的init( )方法,通過(guò)init( )方法初始化圖像文件、聲音文件、字體或者其他一些對(duì)象等。(2) start( )方法。Applet運(yùn)行init( )方法之后將自動(dòng)調(diào)用start( )方法,start( )方法體現(xiàn)了小應(yīng)用程序要完成的功能。我

7、們可以重載父類(lèi)的start( )方法,在這個(gè)方法體內(nèi)實(shí)現(xiàn)我們程序的功能。 (3) paint( )方法。它的主要作用是在Applet的界面中顯示文字、圖形和其他界面元素。瀏覽器調(diào)用paint( )方法的事件主要有如下三種。 當(dāng)瀏覽器首次顯示Applet時(shí),會(huì)自動(dòng)調(diào)用paint( )方法。 當(dāng)用戶調(diào)整窗口大小或移動(dòng)窗口時(shí),瀏覽器會(huì)調(diào)用paint( )方法。 當(dāng)repaint( )方法被調(diào)用時(shí),系統(tǒng)將首先調(diào)用update( )方法將Applet對(duì)象所占用的屏幕空間清空,然后調(diào)用paint( )方法重畫(huà)。 (4) stop( )方法。當(dāng)用戶將瀏覽Applet程序所在的Web頁(yè)面切換到其他頁(yè)面時(shí),瀏覽

8、器會(huì)自動(dòng)調(diào)用stop( )方法,讓Applet程序終止運(yùn)行。如果用戶又回到Applet程序所在的Web頁(yè)面,則瀏覽器將重新啟動(dòng)Applet程序的start( )方法。(5) destroy( )方法。當(dāng)用戶關(guān)閉Applet程序窗口時(shí),瀏覽器會(huì)自動(dòng)執(zhí)行此方法來(lái)結(jié)束程序,釋放所占資源。 9.1.3 JApplet類(lèi)在Java的早期版本中,窗體、按鈕等組件被列入java.awt包中。隨著Java系統(tǒng)的不斷改進(jìn)和功能的增強(qiáng),在1998年推出JDK1.2版本時(shí),javax.Swing包被列入Java2的基礎(chǔ)類(lèi)庫(kù)JFC(Java Fundation Classes)中。Swing擴(kuò)展了AWT組件集,定義了

9、相對(duì)于java.awt包的具有更多、更強(qiáng)功能的Swing GUI組件集。javax.Swing.JApplet是java.applet.Applet的子類(lèi),且具有如下繼承關(guān)系: java.lang.Object java.awt.Component java.awt.Container java.awt.Panel java.applet.Applet javax.swing.JApplet 9.1.4 Java 2D APIJava 2D API是Java用于開(kāi)發(fā)二維圖形的API。在Java的AWT和Swing類(lèi)庫(kù)中,提供了一些簡(jiǎn)單的二維圖形處理功能。而Java 2D API則提供了強(qiáng)大靈活

10、且獨(dú)立于圖形設(shè)備的二維圖形處理功能,它是JFC的一個(gè)組成部分,它提供了處理二維圖形、圖像、文字等對(duì)象的統(tǒng)一機(jī)制和統(tǒng)一的圖形轉(zhuǎn)換機(jī)制。J2SDK提供的Java 2D API中的核心類(lèi)和接口有:java.awt、java.awt.geom、java.awt.font、java.awt.color、java.awt.image、java.awt.image.renderable及java.awt.print。 Java 2D API在java.awt包中用于處理二維圖形的類(lèi)和接口有:AlphaComposite、BasicStroke、Color、Composite、CompositeCotext、

11、Font、FontMetrics、GradientPaint、Graphics2D、GraphicsConfiguration、GraphicsEnvironment、Paint、PaintContext、Point、Polygon、Rectangle、Shape、Stroke、TexturePaint及Transparency等。 Java 2D API在java.awt.geom包中用于定義幾何形狀的類(lèi)和接口有:Arc2D、Arc2D.Double、Arc2D.Float、Area、BasicTextUI.BasicCaret、CubicCurve2D、CubicCurve2D.Doubl

12、e、CubicCurve2D.Float、DefaultCaret、Ellipse2D、Ellipse2D.Double、Ellipse2D.Float、GeneralPath、Line2D、Line2D.Double、Line2D.Float、Polygon、QuadCurve2D、QuadCurve2D.Double、QuadCurve2D.Float、Rectangle、Rectangle2D、Rectangle2D.Double、Rectangle2D.Float、RectangularShape、RoundRectangle2D、RoundRectangle2D.Double及Rou

13、ndRectangle2D.Float。Java 2D API在其他一些包,如java.awt.font、java.awt.color、java.awt.image、java.awt.image.renderable及java.awt.print中的類(lèi)和接口請(qǐng)查閱Java 2D API幫助文檔。 9.1.5 與圖形文字有關(guān)的類(lèi)及其繼承關(guān)系圖9.1給出了java.awt包層次的一部分有關(guān)文字、顏色和基本圖形的類(lèi)。圖中的每一個(gè)類(lèi)都是從類(lèi)Object直接派生出來(lái)的。其中,類(lèi)Font是用于操作字體的;類(lèi)Color是用于操作顏色的;類(lèi)BasicStroke用于創(chuàng)建圖形形狀輪廓;類(lèi)Graphics用于繪制

14、各種串、線、矩形、圓和其他幾何圖形;類(lèi)Graphics2D則提供了繪制任意幾何形狀圖形的功能。 圖9.1 java.awt包中常用的圖形文字類(lèi)(是由Object類(lèi)派生的) 9.1.6 Java 2D API坐標(biāo)系統(tǒng)應(yīng)用Java 2D API繪制文本與圖形時(shí)有兩種坐標(biāo)系,一種是與設(shè)備無(wú)關(guān)的邏輯坐標(biāo)系,也稱(chēng)為用戶坐標(biāo)系;另一種是與設(shè)備(例如顯示器、打印機(jī)等)有關(guān)的坐標(biāo)系。Java 2D API具有自動(dòng)轉(zhuǎn)換兩種坐標(biāo)系的功能。在默認(rèn)情況下,用戶坐標(biāo)系的原點(diǎn)在繪圖表面的左上角,左上角坐標(biāo)為(0,0),x坐標(biāo)從左向右遞增,y坐標(biāo)從上向下遞增。當(dāng)文本與圖形在屏幕上輸出時(shí),坐標(biāo)單位以像素來(lái)度量。我們給出的所有

15、文本與圖形都是相對(duì)于用戶坐標(biāo)系的。圖9.2中的點(diǎn)p表示在用戶坐標(biāo)系中的位置。 圖9.2 Java用戶坐標(biāo)系統(tǒng)9.1.7 三種圖形對(duì)象Graphics2D對(duì)象可以輸出以下三種圖形對(duì)象:(1) 形狀(shape)圖形對(duì)象。它是一些幾何圖形類(lèi)型,如矩形、橢圓、直線和曲線,每種形狀對(duì)象實(shí)現(xiàn)Java.awt.Shape接口。(2) 文本(text)圖形對(duì)象。它可以按不同的字體、風(fēng)格和顏色輸出。(3) 圖像(image)圖形對(duì)象。它是java.awt.image.BufferedImage類(lèi)的對(duì)象。由于圖像(image)的內(nèi)容非常多,因此本章只講述基礎(chǔ)性形狀和文本兩類(lèi)圖形對(duì)象的繪制,偶爾也會(huì)用到一些圖像的

16、知識(shí)。 9.1.8 Graphics2D對(duì)象的屬性設(shè)置Graphics2D對(duì)象通過(guò)其屬性來(lái)封裝繪圖用的狀態(tài)信息。因此,在繪制二維幾何圖形前,需要對(duì)圖形對(duì)象的屬性進(jìn)行設(shè)置。Graphics2D對(duì)象提供了下面七個(gè)屬性的設(shè)置和獲得方法:(1) Paint屬性:用來(lái)對(duì)要繪制的圖形或文字的顏色進(jìn)行設(shè)置。具體設(shè)置是通過(guò)它的成員方法setPaint()和getPaint()來(lái)實(shí)現(xiàn)的。例如,假設(shè)g2是Graphics2D對(duì)象,可以用g2.setPaint(Color.green)語(yǔ)句設(shè)置g2的paint屬性為綠色。(2) Stroke屬性:通過(guò)setStroke()方法來(lái)控制圖形輪廓線的形狀。例如,用g2.s

17、etStroke(new BasicStroke(4)語(yǔ)句設(shè)置Graphics2D對(duì)象g2的圖形輪廓線的寬度為4個(gè)像素。 (3) Front屬性:用于設(shè)置輸出文本的字體。(4) Transformation屬性:通過(guò)setTransform( )方法來(lái)實(shí)現(xiàn)圖形的縮放、旋轉(zhuǎn)和移位等。(5) Composite rule屬性:通過(guò)setComposite( )方法來(lái)描述繪圖操作如何與存在的背景相復(fù)合。(6) Clipping space屬性:通過(guò)setClip( )方法來(lái)設(shè)置剪切區(qū)域(clip area),即它將繪圖限制在一個(gè)設(shè)定的區(qū)域內(nèi),使繪圖操作在這個(gè)區(qū)域外無(wú)效。(7) Rendering h

18、ints屬性:通過(guò)setRenderingHints( )方法來(lái)控制繪圖的質(zhì)量和速度。 9.2 繪 制 文 字 9.2.1 繪制文字的成員方法由于字符串可以用字符串對(duì)象、字符數(shù)組、字節(jié)數(shù)組這三種不同形式表示,故Java在Graphics類(lèi)中相應(yīng)地提供了三個(gè)成員方法來(lái)繪制這三種不同形式的字符串(見(jiàn)表9.1)。 表9.1 繪制字符和字符串的成員方法 表9.2 繪制字符的常用成員方法 【示例程序c9_1.java】 使用Graphics類(lèi)的三個(gè)成員方法繪制“WELCOME TO XIAN”。import java.applet.*;import java.awt.*;import javax.swi

19、ng.*;public class c9_1 extends JApplet private String s = WELCOME!; private char c = T,O,a,e,t; private byte b = d,4,X,I,047,A,N;public void paint( Graphics g) /覆蓋Applet的成員方法 g.drawString( s, 50, 25); g.drawChars( c, 0, 2, 50, 50); g.drawBytes( b, 2, 5, 50, 75); 在這個(gè)程序中,為了學(xué)習(xí)使用繪制字符和字符串的三個(gè)成員方法,我們分別定義了一

20、個(gè)字符串對(duì)象s、一個(gè)字符數(shù)組c和一個(gè)字節(jié)數(shù)組b,分別用于保存三行文字內(nèi)容。最后,我們通過(guò)覆蓋JApplet類(lèi)的paint( )方法,并在這個(gè)方法中引用繪制字符和字符串的成員方法實(shí)現(xiàn)了文字的繪制。該程序的運(yùn)行結(jié)果見(jiàn)圖9.3。 圖9.3 程序c9_1的運(yùn)行結(jié)果 【示例程序c9_2.java】 使用Graphics2D類(lèi)的成員方法繪制“WELCOME TO XIAN”。import java.applet.*;import java.awt.*;import javax.swing.JApplet;public class c9_2 extends JApplet private String s

21、= WELCOME!; private char c = T,O,a,e,t; private byte b = d,4,X,I,047,A,N; public void paint(Graphics g) /為保證方法可以訪問(wèn)繪圖環(huán)境的全部功能,把g強(qiáng)制轉(zhuǎn)換成Graphics2D Graphics2D g2=(Graphics2D)g; g2.drawString( s, 50, 25); g2.drawChars( c, 0, 2, 50, 50); /Graphics2D是Graphics的子類(lèi),可以繼承Graphics類(lèi)的方法 g2.drawBytes( b, 2, 5, 50, 75

22、); 9.2.2 Font類(lèi) 1. Font類(lèi)的構(gòu)造方法Font類(lèi)用來(lái)描述字體的名稱(chēng)(Name)、大小(Size)和樣式(Style)。使用Font類(lèi)的構(gòu)造方法創(chuàng)建一個(gè)Font類(lèi)的對(duì)象,其格式如下:Font(String fontname,int style,int size)其中:fontname為字型名,如宋體、黑體、楷體、Arial、Courier、TimesRoman、Helvetica等;style為字體樣式,如粗體(BOLD)、斜體(ITALIC)、正常體(PLAIN);Size為用像素點(diǎn)表示的字體大小。 2. Font類(lèi)的成員方法創(chuàng)建一個(gè)Font類(lèi)對(duì)象后,就可以使用Font類(lèi)提供

23、的成員方法來(lái)獲取字體、字型等方面的信息。Font類(lèi)提供的常用成員方法如表9.3所示。 表9.3 java.awt.Font類(lèi)方法 3. 設(shè)置字體可以用java.awt.Graphics類(lèi)的成員方法來(lái)設(shè)置自己希望使用的字體,其格式如下:setFont(Font myFont); 4. 自定義字體繪制文字的步驟自定義字體繪制文字的步驟如下:(1) 創(chuàng)建Font類(lèi)對(duì)象,指定字體名、字體樣式及字體大??;(2) 使用.setFont( )設(shè)置創(chuàng)建好的Font類(lèi)對(duì)象;(3) 調(diào)用drawString( )方法繪制文字。 【示例程序c9_3.java】 使用不同的字體繪制文字。import java.app

24、let.*;import java.awt.*;import javax.swing.JApplet;public class c9_3 extends JApplet Font f1 = new Font(TimesRoman,Font.BOLD,16);/字體為T(mén)imesRoman,字體樣式加粗 Font f2 = new Font(Courir,Font.ITALIC,24); /字體為Courir,字體樣式傾斜 Font f3 = new Font(Helvetica,Font.PLAIN,14); /常規(guī) String hStr = Courir; public void paint

25、(Graphics g) Graphics2D g2=(Graphics2D)g; g2.setFont(f1); g2.drawString(TimesRoman,20,50); g2.setFont(f2); g2.drawString(hStr,20,100); g2.setFont(f3); g2.drawString(Helvetica,20,150); 圖94 程序c8_3的運(yùn)行結(jié)果【示例程序c9_4.java】 獲取字體信息。import java.applet.Applet;import java.awt.Graphics;import java.awt.Font;public

26、 class c8_3 extends Applet Font f=new Font(Courier, Font.ITALIC+Font.BOLD,24); /字體樣式傾斜加粗 public void paint(Graphics g) Graphics2D g2=(Graphics2D)g; int style,size; String s,name; g2.setFont(f); style=f.getStyle(); /得到字體樣式 if (style =Font.PLAIN) s=Plain; else if (style =Font.BOLD) s=Bold; else if (st

27、yle =Font.ITALIC) s=Italic; else s=Bold italic; size=f.getSize(); /得到字體大小 s+=size+point; name=f.getName(); /得到字體名稱(chēng) s+=name; g2.drawString(s,10,50); 圖9.5 程序c9_4的運(yùn)行結(jié)果9.3 Color 類(lèi)9.3.1 Color類(lèi)的構(gòu)造方法表9.4 java.awt.Color 類(lèi)的構(gòu)造方法 不論使用哪個(gè)構(gòu)造方法來(lái)創(chuàng)建Color對(duì)象,都需要指定新建顏色中的R(紅)、G(綠)、B(藍(lán))三色的比例。Java提供的這三個(gè)構(gòu)造方法用不同的方式確定RGB的比例,

28、可以使編程者從256256256(約16 000 000)種顏色中進(jìn)行選擇。一個(gè)RGB值由三部分組成:第一個(gè)RGB部分定義紅色的量;第二個(gè)RGB部分定義綠色的量;第三個(gè)RGB部分定義藍(lán)色的量。RGB值中某一部分的值越大,那種特定顏色的量就越大。9.3.2 Color類(lèi)數(shù)據(jù)成員常量 用戶除了可以使用構(gòu)造方法指定Color的RGB值外,Java還對(duì)一些常用的顏色提供了如表9.5所示的Color類(lèi)數(shù)據(jù)成員常量。表9.5 Color類(lèi)static數(shù)據(jù)成員常量和RGB值9.3.3 Color類(lèi)的成員方法表9.6 Java.awt.Color類(lèi)成員方法 此外,還可以用java.awt.Graphics2D

29、類(lèi)的方法設(shè)定顏色或獲取顏色。這些方法及其功能如下: setBackground(Color c):設(shè)定背景顏色,c代表顏色。 getPaint ( ):獲取當(dāng)前所使用的顏色。 setPaint( new Color(int r,int g,int b):設(shè)定前景顏色的另一個(gè)方法。 setPaint(Color c):設(shè)定前景顏色,c代表顏色。 setColor(new Color(int r,int g,int b):設(shè)定前景顏色的另一個(gè)方法,c代表顏色。 9.3.4 應(yīng)用舉例【示例程序c9_5.java】 設(shè)置字符顏色。import java.applet.*;import java.awt

30、.*;import javax.swing.JApplet;public class c9_5 extends JApplet public void paint(Graphics g) Graphics2D g2=(Graphics2D)g; int red,green,blue; red =255; blue =255; green =0; g2.setPaint( new Color( red,green,blue); /設(shè)置前景顏色 setBackground(Color.cyan); /設(shè)置背景顏色 g2.drawString(Welcome to Xi047an, 25,75);

31、showStatus(Current RGB: + g2.getPaint().toString(); /狀態(tài)行顯示繪圖文字顏色信息 圖9.6 程序c9_5的運(yùn)行結(jié)果 9.4 繪制形狀圖形 9.4.1 繪制幾何圖形的方法與步驟java.awt.geom包中定義了許多實(shí)現(xiàn)幾何圖形的類(lèi),這些類(lèi)可以創(chuàng)建幾何圖形對(duì)象,然后通過(guò)Graphics2D類(lèi)的對(duì)象可以顯示這些幾何圖形。有兩種繪制幾何圖形的方法:一種是使用draw( )方法繪制圖形輪廓;另一種是使用fill( )方法繪制內(nèi)部填充的幾何圖形。 輪廓幾何圖形的繪制步驟如下:(1) 創(chuàng)建一個(gè)Graphics2D類(lèi)的對(duì)象;(2) 創(chuàng)建一個(gè)幾何形狀類(lèi)geo

32、m的對(duì)象shape;(3) 按要求設(shè)置Graphics2D的屬性;(4) 調(diào)用Graphics2D類(lèi)的對(duì)象的draw(shape)方法繪制幾何圖形。繪制內(nèi)部填充的幾何圖形也可分為4步,其中前3步與輪廓幾何圖形的繪制步驟相同,只是在第4步中調(diào)用的是Graphics2D類(lèi)的對(duì)象的fill(shape)方法。 9.4.2 繪制線段與矩形線段與矩形是最常用的幾何圖形之一,Java2D API中提供了繪制直線、二次曲線、三次曲線、平面矩形、圓角矩形等圖形的構(gòu)造方法,如表9.7所示。在這些方法中,繪制圓角矩形除了要指定矩形區(qū)域外,還需要指明圓角的弧寬(arcw)和弧高(arch)。 表9.7 繪制線段與矩

33、形用到的構(gòu)造方法 【示例程序c9_6.java】 在窗體上繪制直線、二次曲線及三次曲線。 import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; class drawPanel extends JPanel public void paint(Graphics g) Graphics2D g2=(Graphics2D)g; Line2D.Double Line1=new Line2D.Double(20.0,20.0,80.0,

34、40.0); QuadCurve2D.Double Line2=new QuadCurve2D.Double(130.0,30.0,150.0,50.0,170.0,20.0); CubicCurve2D.Double Line3=new CubicCurve2D.Double(220.0,40.0,240.0,60.0,260.0,20.0,300.0,35.0); g2.setPaint(Color.red); /設(shè)置前景顏色 g2.draw(Line1); g2.draw(Line2); g2.draw(Line3); public class c9_6 public c9_6( ) J

35、Frame.setDefaultLookAndFeelDecorated(true); /設(shè)置窗體圖標(biāo)顯示為默認(rèn)方式 JFrame f=new JFrame(draw Line); /創(chuàng)建窗體對(duì)象 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /點(diǎn)擊窗口關(guān)閉圖標(biāo)關(guān)閉窗口 drawPanel pa=new drawPanel( ); /創(chuàng)建容器JPanel類(lèi)的對(duì)象 pa.setPreferredSize(new Dimension(350, 100); /設(shè)置JPanel類(lèi)對(duì)象的大小 Container cp=f.getContentPane

36、( ); /創(chuàng)建JFrame的容器對(duì)象 pa.setBackground(Color.cyan); /設(shè)置pa對(duì)象的背景顏色 /cp容器的布局為BorderLayout,添加pa到cp容器中并居中 cp.add(pa,BorderLayout.CENTER); f.pack( ); /調(diào)整窗口 f.setVisible(true); /設(shè)置窗口為可見(jiàn) public static void main(String args) new c9_6( ); 圖9.7 程序c9_6的運(yùn)行結(jié)果 【示例程序c9_7.java】 繪制各種矩形。import java.applet.*;import java.

37、awt.*;import java.awt.event.*;import java.awt.geom.*;import javax.swing.*;public class c9_7 extends JApplet public void paint(Graphics g) Graphics2D g2=(Graphics2D)g; g2.setPaint(Color.red); /設(shè)置前景顏色 / draw Rectangle2D.Double Rectangle2D.Double rec=new Rectangle2D.Double(20,20,60,30); /創(chuàng)建矩形對(duì)象 g2.draw

38、(rec); g2.drawString(Rectangle2D,20,70); / draw RoundRectangle2D.Double g2.setStroke(new BasicStroke(4); /設(shè)置線寬 g2.draw(new RoundRectangle2D.Double(100,20,60,30,10,10); /創(chuàng)建圓角矩形對(duì)象并畫(huà)出 g2.drawString(RoundRectangle2D,100,70); g2.setPaint(Color.blue); /設(shè)置前景顏色 / fill Rectangle2D.Double Rectangle2D.Double r

39、ec1=new Rectangle2D.Double(20,80,60,30); g2.fill(rec1); g2.drawString(Rectangle2D,20,120); / fill RoundRectangle2D.Double g2.setStroke(new BasicStroke(4); /設(shè)置線寬 RoundRectangle2D.Double rorec=new RoundRectangle2D.Double(100,80,60,30,10,10); g2.fill(rorec); g2.drawString(RoundRectangle2D,100,120); 該程序

40、的運(yùn)行結(jié)果如圖9.8所示。 圖9.8 程序c9_7的運(yùn)行結(jié)果 9.4.3 繪制橢圓、圓及弧在Java2D API中,繪制一個(gè)橢圓就是使用橢圓類(lèi)的構(gòu)造方法來(lái)創(chuàng)建一個(gè)橢圓對(duì)象。橢圓類(lèi)的構(gòu)造方法是:Ellipse2D.Float(float x, float y, float w, float h)這個(gè)構(gòu)造方法中有4個(gè)參數(shù),分別是橢圓外切矩形的左上角頂點(diǎn)坐標(biāo)x,y;橢圓的寬度w和高度h(當(dāng)然也是外切矩形的寬度和高度)。這些參數(shù)的數(shù)據(jù)類(lèi)型可以是float型或double型。顯然,當(dāng)橢圓的寬度w和高度h相等時(shí),就是一個(gè)圓。因此,使用繪制橢圓的構(gòu)造方法即可繪制圓。 畫(huà)弧可看成是畫(huà)部分橢圓。繪制一個(gè)弧的構(gòu)造

41、方法如下:Arc2D.Float(float x, float y, float w, float h, float start,float extent, int type)這個(gè)構(gòu)造方法中有7個(gè)參數(shù),其中:前4個(gè)參數(shù)x、y、w、h的含義與橢圓中參數(shù)的意義相同,另外3個(gè)參數(shù)中的start為起始角度,extent為弧角度,type為弧的連接類(lèi)型?;〗嵌萫xtent用度數(shù)來(lái)衡量,表明一段弧在兩個(gè)角度之間繪制,即表示從起始角度轉(zhuǎn)多少角度畫(huà)弧,extent為正,表示逆時(shí)針畫(huà)弧,extent為負(fù),表示順時(shí)針畫(huà)弧?;〉倪B接類(lèi)型有OPEN、CHORD、PIE三種,OPEN表示弧兩端點(diǎn)無(wú)連接(弧),CHORD

42、表示弧的兩端點(diǎn)用直線連接(弦),PIE表示弧兩端連接成扇形。 表9.8 創(chuàng)建橢圓及弧類(lèi)對(duì)象的構(gòu)造方法 下面我們通過(guò)一些實(shí)例來(lái)說(shuō)明怎樣來(lái)繪制這些圖形?!臼纠绦騝9_8.java】 繪制橢圓、圓及扇形。import java.applet.*;import java.awt.*;import java.awt.geom.*;import javax.swing.*;public class c9_8 extends Japplet public void paint(Graphics g) Graphics2D g2=(Graphics2D)g; g2.setPaint(Color.red);

43、/設(shè)置前景顏色 g2.setStroke(new BasicStroke(2); /設(shè)置線寬 /繪制弧 g2.draw(new Arc2D.Double(15,15,80,80,60,125,Arc2D.OPEN); g2.draw(new Arc2D.Double(100,15,80,80,60,125,Arc2D.CHORD); g2.draw(new Arc2D.Double(200,15,80,80,60,125,Arc2D.PIE); g2.fill(new Arc2D.Double(280,15,80,80,60,125,Arc2D.OPEN); g2.drawString(Arc

44、2D,100,90); /繪制圓及橢圓 g2.drawString(Ellipse2D,100,220); g2.setPaint(Color.lightGray); Ellipse2D.Double e1=new Ellipse2D.Double(15,120,100,50); Ellipse2D.Double e2=new Ellipse2D.Double(150,120,80,80); g2.fill(e2); g2.setPaint(Color.black); g2.setStroke(new BasicStroke(6); g2.drawString(Ellipse2D,100,22

45、0); g2.draw(e1); g2.draw(e2); 該程序的運(yùn)行結(jié)果如圖9.9所示。 圖9.9 程序c9_8的運(yùn)行結(jié)果 9.4.4 繪制多邊形 多邊形是由一系列首尾相接的直線組成的。在Java2D API中繪制多邊形的步驟如下: (1) 創(chuàng)建多邊形的x坐標(biāo)數(shù)組與y坐標(biāo)數(shù)組; (2) 創(chuàng)建GeneralPath類(lèi)的幾何圖形的路徑對(duì)象; (3) 調(diào)用路徑對(duì)象的成員方法moveTo( ),將準(zhǔn)備抬筆移動(dòng)的點(diǎn)(彼此間無(wú)連線的點(diǎn))的坐標(biāo)添加到路徑對(duì)象中; (4) 調(diào)用路徑對(duì)象的成員方法lineTo( ),將準(zhǔn)備從當(dāng)前位置畫(huà)直線的點(diǎn)的坐標(biāo)添加到路徑對(duì)象中;(5) 若要畫(huà)封閉多邊形,則應(yīng)調(diào)用路徑對(duì)象

46、的成員方法closePath( )來(lái)進(jìn)行這一設(shè)置;(6) 調(diào)用Graphics2D的對(duì)象的成員方法draw( )或fill( )畫(huà)多邊形。 【示例程序c9_9.java】 繪制多邊形。import java.applet.*;import java.awt.*;import java.awt.geom.*;import javax.swing.*;public class c9_9 extends JApplet public void paint(Graphics g) Graphics2D g2 =(Graphics2D)g; g2.setPaint(Color.red); / setBa

47、ckground(Color.green); int x1 =20,40,50,30,20,15,20; /建立第一個(gè)多邊形的x 坐標(biāo)數(shù)據(jù)int y1 =20,20,30,50,50,30,20; /建立第一個(gè)多邊形的y坐標(biāo)數(shù)據(jù)int x2 =90,110,100,80,70,65,60,70; /建立第二個(gè)多邊形的x 坐標(biāo)數(shù)據(jù)int y2 =90,110,80,100,100,80,60,70; /建立第二個(gè)多邊形的y坐標(biāo)數(shù)據(jù) int x3 =190,218,150,230,162; /建立第三個(gè)多邊形的x 坐標(biāo)數(shù)據(jù) int y3 =20,100,46,46,100; /建立第三個(gè)多邊形的y

48、 坐標(biāo)數(shù)據(jù) GeneralPath polygon = new GeneralPath(0,x1.length+x2.length); /創(chuàng)建幾何圖形的路徑對(duì)象 polygon.moveTo(x10, y10); /將準(zhǔn)備抬筆移動(dòng)的點(diǎn)的坐標(biāo)添加到對(duì)象polygon中for ( int index = 1; index x1.length ; index+ ) /將準(zhǔn)備從當(dāng)前位置畫(huà)直線的點(diǎn)的坐標(biāo)添加到對(duì)象polygon中 polygon.lineTo(x1index, y1index); polygon.moveTo(x20, y20); for ( int index = 1; index x

49、2.length ; index+ ) polygon.lineTo(x2index, y2index); polygon.closePath( ); /設(shè)置從筆的當(dāng)前位置畫(huà)直線到最后一次抬筆的位置 g2.draw(polygon); /畫(huà)多邊形 /畫(huà)五角星 GeneralPath polygon2 = new GeneralPath(0,x3.length); polygon2.moveTo(x30, y30); for ( int index = 1; index x3.length ; index+ ) polygon2.lineTo(x3index, y3index); g2.fill

50、(polygon2); 該程序的運(yùn)行結(jié)果如圖9.10所示。 圖9.10 程序c9_9的運(yùn)行結(jié)果 在該程序中給出了創(chuàng)建路徑對(duì)象的語(yǔ)句,它可以由直線、二次、三次曲線形成幾何路徑。創(chuàng)建該對(duì)象的構(gòu)造方法是: GeneralPath(intrule, intinitialCapacity) 其中:rule為環(huán)繞規(guī)則,可以是WIND_EVEN_ODD或 WIND_NON_ZERO;initialCapacity為坐標(biāo)點(diǎn)總個(gè)數(shù)。 9.4.5 圖形重疊時(shí)的色彩設(shè)置當(dāng)繪制的圖形對(duì)象與已有的圖形對(duì)象重疊時(shí),圖形的重疊部分需要確定如何將新畫(huà)圖形對(duì)象(Source)的顏色與已有的圖形對(duì)象(Destination)的顏

51、色相復(fù)合。Java 2D提供的Composite和CompositeContext 兩種接口構(gòu)成了圖形對(duì)象間顏色復(fù)合模式的基礎(chǔ)。其中,實(shí)現(xiàn)Composite接口的類(lèi)是AlphaComposite。 繪制重疊圖形對(duì)象的一般步驟是:首先創(chuàng)建AlphaComposite 類(lèi)的對(duì)象(如本例中的ac),并用類(lèi)的getInstance( )方法來(lái)獲取一種特定的顏色混合規(guī)則和透明度這兩個(gè)參數(shù);第二步是調(diào)用setComposite( )方法將由getInstance( )方法獲得的顏色復(fù)合模式指定給特定的圖形對(duì)象;最后是使用fill( )方法來(lái)繪制重疊圖形。遵循這樣幾個(gè)步驟,可以使重疊圖形對(duì)象的顏色具有復(fù)合效

52、果,制作出多彩的圖形。顏色混合規(guī)則是通過(guò)使用系統(tǒng)提供的下述屬性常量:CLEAR、DEST_IN、DEST_OUT、DEST_OVER、SRC、SRC_IN、SRC_OUT和SRC_OVER中的某一個(gè)來(lái)實(shí)現(xiàn)的。這些屬性常量的作用(在沒(méi)有指定透明度的情況下)如圖9.11所示。 圖9.11 畫(huà)重疊圖形對(duì)象的重疊模式 下面通過(guò)一個(gè)具體的實(shí)例來(lái)說(shuō)明。【示例程序c9_10.java】 繪制復(fù)合圖形。import java.applet.*;import java.awt.*;import java.awt.geom.*;import javax.swing.*;public class c9_10 ext

53、ends JApplet public void paint(Graphics g) Rectangle2D.Double rec1=new Rectangle2D.Double(0,0,100,100), rec2=new Rectangle2D.Double(50,0,100,100), rec3=new Rectangle2D.Double(125,75,100,100), rec4=new Rectangle2D.Double(50,125,100,100), rec5=new Rectangle2D.Double(-25,75,100,100); Graphics2D g2=(Gra

54、phics2D)g; g2.setPaint(Color.red); /將用戶坐標(biāo)系的原點(diǎn)(0,0)平移到屏幕坐標(biāo)系x為100,y為50像素點(diǎn)的位置g2.translate(100,50); / radians=degree * pie / 180 g2.rotate(45*java.lang.Math.PI)/180); /將圖形旋轉(zhuǎn)45g2.fill(rec1); /畫(huà)左上角坐標(biāo)為(0,0),長(zhǎng)與寬為100的填充矩形 /創(chuàng)建仿射變換對(duì)象,設(shè)置幾何圖形變換為默認(rèn)方式g2.setTransform(new AffineTransform( ); /創(chuàng)建一個(gè)AlphaCcomposite類(lèi)的復(fù)合

55、對(duì)象ac,規(guī)則為50%的透明度AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f); g2.setComposite(ac); /設(shè)定重疊對(duì)象的顏色復(fù)合方式 g2.setPaint(Color.green); g2.fill(rec2); g2.setPaint(Color.blue); g2.fill(rec3); g2.setPaint(Color.yellow); g2.fill(rec4); g2.setPaint(Color.pink); g2.fill(rec5); 該程序的運(yùn)行結(jié)果

56、如圖9.12所示。 圖9.12 程序c9_10的運(yùn)行結(jié)果 9.4.6 繪制剪切文字圖形 Java 2D API中提供了文字圖形的剪切功能,該功能通過(guò)在圖形環(huán)境中設(shè)置一個(gè)剪切形狀,來(lái)將所有的繪圖操作限制在該剪切形狀的內(nèi)部進(jìn)行。剪切文字圖形的操作步驟如下(1) 創(chuàng)建文字字符串對(duì)象;(2) 用FontRenderContext類(lèi)創(chuàng)建字體繪制環(huán)境對(duì)象;(3) 用TextLayout類(lèi)創(chuàng)建文本布局對(duì)象;(4) 用GeneralPath類(lèi)創(chuàng)建文本圖形的路徑對(duì)象;(5) 對(duì)用戶坐標(biāo)系進(jìn)行平移變換; (6) 創(chuàng)建圖形對(duì)象,該對(duì)象是通過(guò)調(diào)用文本布局對(duì)象的getOutline()成員方法得到的圖形輪廓;(7) 用

57、路徑對(duì)象的append( )成員方法,添加圖形對(duì)象到路徑對(duì)象中;(8) 用Graphics2D類(lèi)對(duì)象的成員方法draw( )畫(huà)文字圖形,并用Graphics2D類(lèi)對(duì)象的成員方法clip( )剪切文字圖形。(9) 設(shè)置剪切的形狀,繪制一組線條。 【示例程序c9_11.java】 繪制剪切文字圖形。import java.awt.event.*;import java.awt.font.*;import java.awt.geom.*;import javax.swing.*;import java.awt.*; public class c9_11 extends JApplet private Shape clipShape; public void paint(Graphics g) Graphics2D g2 = (Graphics2D)g; clipShape = makeClipShape(g2); g2.draw(clipShape); g2.clip(clipShape); /

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論