第7章圖形用戶界面的設(shè)計與實現(xiàn)課件_第1頁
第7章圖形用戶界面的設(shè)計與實現(xiàn)課件_第2頁
第7章圖形用戶界面的設(shè)計與實現(xiàn)課件_第3頁
第7章圖形用戶界面的設(shè)計與實現(xiàn)課件_第4頁
第7章圖形用戶界面的設(shè)計與實現(xiàn)課件_第5頁
已閱讀5頁,還剩253頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第7章 圖形用戶界面的設(shè)計與實現(xiàn)7.1 圖形用戶界面概述7.2 用戶自定義成分7.3 Java的事件處理7.4 GUI標(biāo)準(zhǔn)組件概述7.5 標(biāo)簽、按鈕與動作事件7.6 文本框、文本區(qū)域與文本事件7.7 單、復(fù)選按鈕,列表與選擇事件7.8 滾動條與調(diào)整事件7.9 畫布與鼠標(biāo)、鍵盤事件7.10 布局設(shè)計7.11 Panel與容器事件7.12 Frame與窗口事件7.13 菜單的定義與使用7.14 對話框、組件事件與焦點事件在Java語言中,為了支持圖形用戶界面的開發(fā),設(shè)計了類庫java.awt包來生成各種標(biāo)準(zhǔn)圖形界面元素和處理圖形界面的各種事件。AWT是abstract window toolkit

2、(抽象窗口工具集)的縮寫。 7.1 圖形用戶界面概述圖形用戶界面的構(gòu)成:圖形用戶界面是一組圖形界面成分和界面元素的有機(jī)組合,這些成分和元素之間不但外觀上有著包含、相鄰、相交等物理關(guān)系,內(nèi)在的也有包含、調(diào)用等邏輯關(guān)系,它們互相作用、傳遞消息,共同組成一個能響應(yīng)特定事件、具有一定功能的圖形界面系統(tǒng)。設(shè)計和實現(xiàn)圖形用戶界面的工作主要兩個: 創(chuàng)建組成界面的各元素,指定它們的屬性和位置關(guān)系,構(gòu)成完整的圖形用戶界面的外觀。 定義圖形用戶界面的事件和各界面元素對不同事件的響應(yīng),實現(xiàn)與用戶的交互。Java中構(gòu)成圖形用戶界面的各種元素和成分有三類:容器、控制組件和用戶自定義成分。1. 容器容器是用來組織其他界面

3、成分和元素的單元。一個應(yīng)用程序的圖形用戶界面首先對應(yīng)于一個復(fù)雜的容器,如一個窗口。利用容器有利于分解圖形用戶界面的復(fù)雜性,當(dāng)界面的功能較多時,可以使用嵌套的容器。2. 控制組件控制組件是圖形用戶界面的最小單位之一,它里面不再包含其他的成分??刂平M件的作用是完成與用戶的一次交互,包括接收用戶的一個命令(如菜單命令),接收用戶的一個文本或選擇輸入,向用戶顯示一段文本或一個圖形,等等。使用控制組件的步驟:(1) 創(chuàng)建某控件類對象,指定屬性。(2) 使用某種布局,將該控件對象加入到某容器中的指定位置。(3) 將該組件對象注冊給它所能產(chǎn)生的事件對應(yīng)的事件監(jiān)聽者,重載事件處理方法,實現(xiàn)利用該組件對象與用戶

4、交互的功能。實際上,容器也是一種控件,因為一個容器也可以被視為組件而包含在其他容器的內(nèi)部。3. 用戶自定義成分繪制幾何圖形、使用標(biāo)志圖案等。用戶自定義成分不能被系統(tǒng)識別和承認(rèn),通常只能起到裝飾、美化的作用,而不能響應(yīng)用戶的動作,也不具有交互功能。Graphics是java.awt包中一個類,包含繪制圖形和文字的方法。當(dāng)一個Applet運行時,執(zhí)行它的瀏覽器自動為它創(chuàng)建一個Graphics實例,利用這個實例,可在Applet中隨意繪制圖形和文字。若需在圖形界面的Java Application程序中繪制圖形,則需創(chuàng)建一個Canvas類的對象加入到該Application程序的圖形界面容器中,Ca

5、nvas對象也有一個與Applet類的paint( )方法相同的paint( )方法,利用系統(tǒng)傳遞給這個paint( )方法的Graphics類參數(shù)對象就可以在Application程序的圖形用戶界面中繪制各種圖形和文字。7.2 用戶自定義成分7.2.1 繪制圖形利用Graphics類可繪制的圖形有直線、各種矩形、多邊形、圓和橢圓等。例 7-1 UsedDrawFigures .javaimport java.awt.*;import java.applet.Applet;public class UsedDrawFigures extends Applet public void paint

6、 ( Graphics g) g.drawLine(30,5,40,5); /畫直線 g.drawRect(40,10,50,20);/畫矩形框(左上角x坐標(biāo),左上角y坐標(biāo),x軸尺寸,y軸尺寸) g.fillRect(60,30,70,40); /畫實心矩形 g.drawRoundRect(110,10,130,50,30,30); /畫圓角矩形框 g.drawOval(150,120,70,40); /畫橢圓形框(左上角x坐標(biāo),左上角y坐標(biāo),x軸尺寸,y軸尺寸),/ 若x軸尺寸與y軸尺寸相等,則畫出圓形 g.fillOval(190,160,70,40); /畫實心橢圓 g.drawOval

7、(90,100,50,40); /畫橢圓框 g.fillOval(130,100,50,40); /畫實心橢圓 drawMyPolygon(g); /自定義的畫多邊形的方法 g.drawString(They are figures!,100,220); public void drawMyPolygon( Graphics g) int xCoords = 30,50,65,119,127; /保存多邊形各點x坐標(biāo)的數(shù)組 int yCoords = 100, 140,127,169,201; /保存多邊形各點y坐標(biāo)的數(shù)組 g.drawPolygon( xCoords,yCoords,5);

8、/畫自由多邊形框 7.2.2 顯示文字Graphics類的方法drawString( )可在屏幕的指定位置顯示一個字符串。Font類,可獲得更豐富多彩和逼真精確的字體顯示效果。一個Font類的對象表示了一種字體顯示效果,包括字體、字型和字號。例如:Font MyFont = new Font ( “TimesRoman”, Font.BOLD, 12 ); MyFont對應(yīng)的是12磅TimesRoman類型的黑體字,其中指定字型時需要用到Font類的三個常量:Font.PLAIN, Font.BOLD, Font.ITALIC。若需使用該Font對象,可利用Graphics類的setFont(

9、 )方法: g. setFont ( MyFont );若指定控件的字體效果,如按鈕或文本框等,可使用控件的方法setFont( )。設(shè)btn是按鈕對象,則語句: btn.setFont(MyFont);把該按鈕上顯示的字體改為12磅的TimesRoman黑體字。getFont( )方法將返回當(dāng)前Graphics或組件對象使用的字體。例 7-2 AvailableFonts.javaimport java.applet.*;import java.awt.*;public class AvailableFont extends Applet GraphicsEnvironment gl = G

10、raphicsEnvironment.getLocalGraphicsEnvironment( );String FontNames = gl.getAvailableFontFamilyNames( );public void paint(Graphics g)Font current,oldFont; oldFont = g.getFont( ); for(int i=0;iFontNames.length;i+) current = new Font(FontNames i,Font.PLAIN,10); g.setFont(current); g.drawString(current.

11、getName( ),10+i%4*120,20+i/4*15); g.setFont(oldFont); 7.2.3 控制顏色Applet中顯示的字符串或圖形的顏色可以用Color類的對象來控制,每個Color對象代表一種顏色,用戶可以直接使用Color類中定義好的顏色常量,也可通過調(diào)配紅、綠、藍(lán)三色的比例創(chuàng)建自己的Color對象。Color類定義了三種構(gòu)造函數(shù):public Color(int Red, int Green, int Blue);/整型參數(shù)指定R,G,B的取值范圍在0255之間public Color(float Red, float Green, float Blue);

12、/浮點參數(shù)R,G,B的取值范圍在0.01.0之間public Color(int RGB); /整型參數(shù)指明RGB三色比例,這個參數(shù)的07比特(取值范圍為0255)代表紅色的比例,815比特代表綠色的比例,1623比特代表藍(lán)色的比例例:創(chuàng)建藍(lán)色:Color blueColor = new Color(0,0,255);Graphics對象的setColor( ):把當(dāng)前的缺省顏色修改成新建的顏色,此后調(diào)用該Graphics對象完成的繪制工作,如繪制圖形、字符串等,都使用這個新建顏色: g.setColor(blueColor);除了創(chuàng)建自己的顏色,也可以直接使用Color類中定義好的顏色常量,

13、如: g.setColor(Color.cyan);Color類中共定義了13種靜態(tài)顏色常量,包括black,orange,pink,grey等,使用時只需以Color為前綴。對于GUI的控制組件,它們有四個與顏色有關(guān)的方法分別用來設(shè)置和獲取組件的背景色和前景色:public void setBackground(Color c)public Color getBackground( )public void setForeground( )public Color getForeground( ) import java.applet.*;import java.awt.*;public c

14、lass MyUseColor extends Applet Color oldColor; String ParamName = red,green,blue; /三個HTML參數(shù)的名稱 int RGBarray = new int3; /保存三色比例的數(shù)組 public void init( ) for(int i=0;iParamName.length;i+) /取得HTML文件指定的三色 RGBarrayi = Integer.parseInt(getParameter(ParamNamei); public void paint(Graphics g) oldColor = g.ge

15、tColor( ); /保存原有的缺省顏色 g.setColor(new Color(RGBarray0,RGBarray1,RGBarray2); /置新顏色 g.drawString(How do you think about Current color: + g.getColor( ).toString( ),10,20); /用新建顏色顯示該顏色的三色分量 g.setColor(oldColor); /恢復(fù)原有顏色 g.drawString(Back to old default color:+ g.getColor( ).toString( ),10,40); 例 7-3 UseC

16、olor.javaHTML文件如下:UseColor 通過改變?nèi)齻€參數(shù)的數(shù)值(應(yīng)在0255之間),就可以指定不同的顏色而不需要重新編譯Java Applet程序。 7.2.4 顯示圖像圖像文件有多種格式,如bmp文件、gif文件、tiff文件等等,其中g(shù)if是Internet上常用的圖像文件格式。Java中可以利用Graphics類的drawImage( )方法來顯示圖像。import java.awt.*;import java.applet.Applet;public class UsedDrawMyImage extends Applet Image myImage ; public v

17、oid init( ) myImage = getImage(getDocumentBase( ), Winter.gif); public void paint(Graphics g) g.drawImage(myImage, 0, 0, this ); /顯示圖像 例 7-4 UsedDrawMyImage.javadrawImage( )是Graphics類中用來顯示圖像的方法。第一個參數(shù)保存有圖像數(shù)據(jù)的Image對象。第二、第三個參數(shù)是圖像的左上角點坐標(biāo),它們決定了圖像在容器中的顯示位置。最后一個參數(shù)是顯示圖像的容器對象。this代表當(dāng)前的Applet對象。 獲取、顯示本機(jī)其它位置處的

18、圖像:Image myImage = getToolkit().getImage(“E:新建相冊IMG_0207.jpg”); 或:Image myImage = Toolkit.getDefaultToolkit().getImage(E:新建相冊IMG_0207.jpg); 顯示來自網(wǎng)上的某張圖片:myImage = this.getToolkit().getImage(new URL(/cnews/2009/5/19/2009051908423880afd.jpg); myImage = this.getImage(new URL(/09/0519/09/59LR8UHQ000120GU

19、.html), /cnews/2009/5/19/200905191050184a0ea.jpg);7.2.5 實現(xiàn)動畫效果動畫是Java Applet最吸引人的特性之一。用Java實現(xiàn)動畫的原理與放映動畫片類似,取若干相關(guān)的圖像或圖片,順序、連續(xù)地在屏幕上先顯示,后擦除,循環(huán)往復(fù)就可以獲得動畫的效果。例 7-5 MyShowAnimator.javaimport java.applet.Applet;import java.awt.*;public class MyShowAnimator extends Applet int x=10;Image m_Images;/保存圖片序列的Imag

20、e數(shù)組 int totalImages = 5; /圖片序列中的圖片總數(shù) int currentImage = 0; /當(dāng)前時刻應(yīng)顯示的圖片序號 public void init( ) m_Images = new ImagetotalImages; /從當(dāng)前目錄下的images子目錄中將Img001.gif到Img0010.gif的文件加載 for(int i=0;itotalImages;i+) m_Imagesi= getImage(getDocumentBase( ),imageswinter00+(i+1) + .gif); public void start( ) currentI

21、mage = 0; /從第一幅開始顯示 public void paint(Graphics g) g.drawImage(m_ImagescurrentImage,x,50,this); /顯示當(dāng)前序號的圖片 x+=20; currentImage = +currentImage % totalImages; /計算下一個應(yīng)顯示圖片的序號 try Thread.sleep(200); /程序休眠50毫秒 catch(InterruptedException e) /處理執(zhí)行休眠方法可能引發(fā)的異常 showStatus(e.toString( ); repaint( ); /圖片停留50毫秒后

22、被擦除,重新調(diào)用paint( )顯示下一張圖片 Thread.sleep( ):使當(dāng)前的程序線程休眠一段時間,以便每幅圖片在下一幅圖片顯示之前在屏幕上逗留一時間,線程的具體編程將在以后章節(jié)介紹。getImage( )方法獲取所有的.gif圖像文件(注意目錄)。paint( )方法一次顯示一幅圖像,稍后再顯示Image對象數(shù)組中的下一幅圖像。圖形用戶界面事件響應(yīng)的基本原理:鍵盤或鼠標(biāo)操作能引發(fā)系統(tǒng)預(yù)先定義好的事件,用戶程序只需要編制代碼定義每個特定事件發(fā)生時程序應(yīng)做出何種響應(yīng)即可。這些代碼會在它們對應(yīng)的事件發(fā)生時由系統(tǒng)自動調(diào)用。Java中,除了鍵盤和鼠標(biāo)操作,系統(tǒng)的狀態(tài)改變、標(biāo)準(zhǔn)圖形界面元素等都

23、可以引發(fā)事件,對這些事件分別定義處理代碼,就可保證應(yīng)用程序在不同狀況下都合理有效、有條不紊地正常工作。Java的事件處理機(jī)制中引入了委托事件模型(如下圖),不同的事件由不同的監(jiān)聽者處理。7.3 Java的事件處理委托事件模型圖形用戶界面的每個可能產(chǎn)生事件的組件叫事件源,不同事件源上發(fā)生的事件的種類不同。如,Button對象或MenuItem對象等作為事件源可能引發(fā)ActionEvent類代表的事件ACTION-PERFORMED;Checkbox對象等作為事件源可能引發(fā)ItemEvent類代表的事件ITEM-STATE-CHANGES。希望事件源上發(fā)生的事件被程序處理,應(yīng)把事件源注冊給能夠處理

24、該事件源上那種類型事件的監(jiān)聽者。例如Button對象把自己注冊給實現(xiàn)了ActionListener接口的對象,因為只有這種對象能夠處理Button對象上發(fā)生的ActionEvent類的事件,監(jiān)聽者可以是包容事件源的容器,也可為另外的對象。注冊方法是通過調(diào)用事件源本身的相關(guān)方法,例如調(diào)用Button類自身的addActionListener( )方法,并以監(jiān)聽者對象作為實際參數(shù)來實現(xiàn)的。監(jiān)聽者具有監(jiān)聽和處理某類事件的功能,因為它實現(xiàn)了有關(guān)的接口,所以監(jiān)聽者需要對它所實現(xiàn)接口的所有抽象方法寫出具體的方法體,對應(yīng)事件源上發(fā)生的事件的處理代碼就寫在這些方法體中。例如對Button上發(fā)生的事件的處理代碼

25、就是寫在Button對象所注冊的監(jiān)聽者的actionPerformed( )方法中,這個方法是對ActionListener接口中同名抽象方法的具體實現(xiàn)。當(dāng)事件源上發(fā)生監(jiān)聽者可以處理的事件時,事件源把這個事件作為實際參數(shù)傳遞給監(jiān)聽者中負(fù)責(zé)處理這類事件的方法(委托),該方法被系統(tǒng)自動執(zhí)行后,事件就得到了處理。監(jiān)聽者不一定是包容事件源的容器對象,這使程序中的事件處理代碼與GUI界面構(gòu)成代碼可以分離,利于優(yōu)化程序結(jié)構(gòu);另外,由于Java對事件作了詳細(xì)的分類并委托不同的接口方法來處理,這也提高了的代碼性能。AWTEvent類體系結(jié)構(gòu)圖Java的所有事件類和處理事件的監(jiān)聽者接口都定義在java.awt.

26、event包中,事件類的層次結(jié)構(gòu)如右圖。上圖中包括的事件類基本都是java.awt.AWTEvent類的子類,而java.awt.AWTEvent類則是java.util.EventObject類的子類。EventObject的一個重要方法是getSource( ) ,該方法返回產(chǎn)生事件的事件源,幾乎所有的事件類都要用到該方法。注意:并非每個事件類都只對應(yīng)一個事件,例如KeyEvent類可能對應(yīng)KEY-PRESSED(鍵按下)、KEY-RELEASED(鍵松開)、KEY-TYPED(擊鍵)三個具體的事件。判斷一個KeyEvent類的對象到底代表哪種事件,可以調(diào)用它的getID( )方法并把方法

27、的返回值與KEY-PRESSED等幾個常量相比較。每個事件類的對象都擁有g(shù)etID( )方法,是它們從共同的父類AWTEvent那里繼承來的。7.4 GUI標(biāo)準(zhǔn)組件概述構(gòu)建程序的圖形用戶界面的主要任務(wù)有兩個:一、創(chuàng)建各界面組件并排列成圖形用戶界面的物理外觀;二、定義組件對不同事件的響應(yīng)、完成圖形用戶界面功能。AWT組件層次關(guān)系圖 基本控件被安放在容器中的某個位置,用來完成用戶交互的功能。使用基本控件的步驟如下:(1) 創(chuàng)建某基本控件類的對象,指定其屬性,如外觀、大小等。(2) 將該對象加入到某個容器的合適位置。(3) 創(chuàng)建該組件對象的監(jiān)聽者,即實現(xiàn)以該組件為事件源的事件對應(yīng)的監(jiān)聽者接口,也可以

28、使現(xiàn)有的類實現(xiàn)該接口成為監(jiān)聽者。將該組件對象注冊給此監(jiān)聽者,并在監(jiān)聽者內(nèi)部實現(xiàn)監(jiān)聽者接口中定義的方法,對該組件可能引發(fā)的事件加以處理,定義新加入的組件對象的交互性界面功能,如接收用戶輸入的文本或選擇、做屏幕顯示輸出等。 Component類是所有組件和容器的抽象父類,它定義了每個容器和組件都可能用到的方法,常用的有:(1) public void add(PopupMenu popup): 在組件上加入一個彈出菜單,當(dāng)用戶用鼠標(biāo)右鍵單擊組件時將彈出該菜單。(2) public Color getBackground( ): 獲得組件的背景色。(3) public Font getFont( )

29、: 獲得組件使用的字體。(4) public Color getForeground( ): 獲得組件的前景色。(5) public Graphics getGraphics( ): 獲得在組件上繪圖時需要使用的Graphics對象。(6) public void repaint(int x, int y, int width, int height): 以指定的坐標(biāo)點(x,y)為左上角,重畫組件中指定寬度(width)、指定高度(height)的區(qū)域。(7) public void setBackground(Color c): 設(shè)置組件的背景色。(8) public void setEna

30、bled(boolean b): 設(shè)置組件的使能狀態(tài)。參數(shù)b為真則組件使能,否則組件不使能。只有使能狀態(tài)的組件才能接受用戶輸入并引發(fā)事件。(9) public void setFont(Font f): 設(shè)置組件使用的字體。(10) public void setSize(int width, int height): 設(shè)置組件的大小。(11) public void setVisible(boolean b): 設(shè)置組件是否可見的屬性。參數(shù)b為真時,組件在包括它的容器可見時也可見;否則組件不可見。(12) public void setForeground(Color c): 設(shè)置組件的前景

31、色。(13) public void requestFocus( ): 使組件獲得注意的焦點。下面從創(chuàng)建、常用方法和事件響應(yīng)幾個方面來討論常用的GUI組件和容器。7.5 標(biāo)簽、按鈕與動作事件1. 標(biāo)簽(Label)標(biāo)簽是用戶只能查看其內(nèi)容的文本顯示區(qū)域,每個標(biāo)簽用一個Label類的對象表示。(1) 創(chuàng)建標(biāo)簽創(chuàng)建標(biāo)簽對象時應(yīng)同時說明這個標(biāo)簽中的字符串:Label prompt = new Label(請輸入一個整數(shù):); (2) 常用方法若需修改標(biāo)簽的文本,可以使用Label對象的方法setText(新字符串);對于一個未知標(biāo)簽,可通過調(diào)用Label對象的getText( )方法來獲得它的文本內(nèi)

32、容。如下所示:if(prompt.getText( )=你好)prompt.setText(再見);else if(prompt.getText( )=再見)prompt.setText(你好); (3) 產(chǎn)生事件標(biāo)簽不能接受用戶的輸入,所以不能引發(fā)事件。它不是事件源。2. 按鈕(Button)按鈕一般對應(yīng)一個事先定義好的功能操作,并對應(yīng)一段程序。當(dāng)用戶點擊按鈕時,系統(tǒng)自動執(zhí)行與該按鈕相聯(lián)系的程序,從而完成預(yù)先指定的功能。(1) 創(chuàng)建創(chuàng)建一個按鈕,傳遞給構(gòu)造函數(shù)的字符串參數(shù)指明按鈕上的標(biāo)簽: Button enter = new Button ( 操作);(2) 常用方法 getLabel(

33、) :返回按鈕標(biāo)簽字符串;setLabel(String s) :把按鈕的標(biāo)簽設(shè)置為字符串s。(3) 產(chǎn)生事件按鈕可以引發(fā)動作事件,當(dāng)用戶單擊一個按鈕時就引發(fā)一個動作事件,希望響應(yīng)按鈕引發(fā)的動作事件的程序須把按鈕注冊給實現(xiàn)了ActionListener接口的動作事件監(jiān)聽者,并為這個接口的actionPerformed(ActionEvent e)方法書寫方法體。在方法體中,可調(diào)用e.getSource( ) 獲取引發(fā)動作事件的按鈕對象引用,或調(diào)用e.getActionCommand( ) 獲取按鈕的標(biāo)簽或事先為這個按鈕設(shè)置的命令名。 import java.applet.*;import ja

34、va.awt.*;import java.awt.event.*;public class UsedBtnLabelAction extends Applet implements ActionListener Label prompt; Button btn; public void init( ) prompt = new Label(你好); btn = new Button(操作); add(prompt); add(btn); btn.addActionListener(this); public void actionPerformed(ActionEvent e) if(e.ge

35、tSource( )=btn) if(prompt.getText( )=你好) prompt.setText(再見); else prompt.setText(你好); 例 7-6 UsedBtnLabelAction .java運行結(jié)果3. 動作事件(ActionEvent)ActionEvent類只包含一個事件,即執(zhí)行動作事件ACTION-PERFORMED。ACTION-PERFORMED是引發(fā)某個動作執(zhí)行的事件。能觸發(fā)該事件的動作有以下四類:(1) 點擊按鈕;(2) 雙擊一個列表中的選項;(3) 選擇菜單項;(4) 在文本框中輸入回車。ActionEvent類的重要方法有:(1) p

36、ublic String getActionCommand( )該方法返回引發(fā)事件的動作的命令名,該命令名可通過調(diào)用setActionCommand( ) 指定給事件源組件,也可使用事件源的缺省命令名。例如一個按鈕組件m-Button是ACTION-PERFORMED事件的事件源,如下語句將這個按鈕對象的動作命令名設(shè)為“命令名”并將它注冊給當(dāng)前的監(jiān)聽者: Button m-Button = new Button(按鈕標(biāo)簽); m-Button.setActionCommand(命令名); m-Button.addActionListener(this); 動作事件的監(jiān)聽者需要實現(xiàn)動作,監(jiān)聽者接

37、口的方法為:public void actionPerformed(ActionEvent e)if ( e.getActionCommand( ) = 命令名 ) 注意:setActionCommand( )方法與getActionCommand( )方法屬于不同的類,getActionCommand( )方法是ActionEvent類的方法,而setActionCommand( )方法是其上發(fā)生動作事件的事件源,如按鈕、菜單項等的方法。事件源對象也可以不專門調(diào)用setActionCommand( )方法來指定命令名,此時getActionCommand( )方法返回缺省的命令名,例如上面的

38、程序片斷如果去掉設(shè)置動作命令名的一句,則監(jiān)聽者接口的方法可以寫為:public void actionPerformed(ActionEvent e)if ( e.getActionCommand( ) = 按鈕標(biāo)簽 ) 可見按鈕的缺省命令名就是按鈕的標(biāo)簽。使用getActionCommand( )方法可以區(qū)分產(chǎn)生動作命令的不同事件源,使actionPerformed( )方法對不同事件源引發(fā)的事件區(qū)分對待處理(區(qū)分事件的事件源也可以使用getSource( )方法,但是這樣一來處理事件的代碼就與GUI結(jié)合得過于緊密,對于小程序尚可接受,對于大程序則不提倡)。 (2) public int g

39、etModifiers( )如果發(fā)生動作事件的同時用戶還按了Ctrl、Shift等功能鍵,則可以調(diào)用這個事件的getModifiers( )方法來獲得和區(qū)分這些功能鍵,實際上是把一個動作事件再細(xì)分成幾個事件;把一個命令細(xì)分成幾個命令。將getModifiers( )方法的返回值與ActionEvent類的幾個靜態(tài)常量ALT-MASK,CTRL-MASK,SHIFT-MASK,META-MASK相比較,就可以判斷用戶按下了哪個功能鍵。7.6 文本框、文本區(qū)域與文本事件 1. 文本事件(TextEvent)TextEvent類只包含一個事件,即代表文本區(qū)域中文本變化的事件TEXT-VALUE-CH

40、ANGED,在文本區(qū)域中改變文本內(nèi)容。例如,刪除字符、鍵入字符都將引發(fā)這個事件。該事件較簡單,不需特別判斷事件類型的方法和常量。2. 文本框與文本域(TextField與TextArea)Java中用于文本處理的基本組件有兩種:單行文本框TextField和多行文本區(qū)域TextArea,它們都是TextComponent的子類。(1) 創(chuàng)建在創(chuàng)建文本組件的同時可以指出文本組件中的初始文本字符串,如下創(chuàng)建一個10行45列的多行文本區(qū)域:TextArea textArea1 = new TextArea(10,45);而創(chuàng)建能容納8個字符,初始字符串為“卡號”的單行文本框可以使用如下的語句:Tex

41、tField name = new TextField(卡號,8); (2) 常用方法先介紹TextComponent中的常用方法,即TextField和TextArea都擁有的常用方法。用戶可以在已創(chuàng)建好的文本區(qū)域中自由輸入和編輯文本信息,對于用戶輸入的信息,可以調(diào)用TextComponent的getText( )方法來獲得,這個方法的返回值為一個字符串。如果希望在程序中對文本區(qū)域顯示的內(nèi)容賦值,可以調(diào)用TextComponent的另一個方法setText( )。例如下面的語句:textArea1.setText(你好,歡迎!);將文本區(qū)域的內(nèi)容置為“你好,歡迎!”。某些情況下需要將文本區(qū)域

42、設(shè)為不能編輯的。例如,電話卡的卡號是系統(tǒng)自動生成的,不需要也不允許用戶隨意改動,這時可用如下的語句使對應(yīng)電話卡卡號的文本框cardNo不可被用戶通過界面改動:cardNo.setEditable(false);使用isEditable( )方法判斷當(dāng)前的文本區(qū)域是否可以被編輯。TextComponent中還有一些用來指定或獲得文本區(qū)域中“選定狀態(tài)”文本的方法,選定狀態(tài)的文本一般用高亮或反白顯示:select(int start, int end) 根據(jù)指定的起止位置選定一段文本;selectAll( ) :選定文本區(qū)域中的所有文本;setSelectionStart( ) 和setSelect

43、ionEnd( ) 分別指定選定文本的起、止位置;getSelectionStart( ) 和getSelectionEnd( ):獲得已經(jīng)選定文本的起、止位置;getSelectedText( )獲得選定文本的具體內(nèi)容(字符串)。TextField自己的方法:例如某些場合下(如輸入密碼時)希望文本區(qū)域中的內(nèi)容不如實回顯在屏幕上,可以調(diào)用如下的方法:TextField tf = new TextField(輸入密碼);tf.setEchoChar(*);此時,TextField中的每個字符(無論中西文)都被回顯成一個星號*,保證看不到其中的實際字符。另外,TextField還定義了echoCh

44、arIsSet( ) 確認(rèn)當(dāng)前文本框是否處于不回顯狀態(tài);getEchoChar( ) 獲得當(dāng)前文本框不回顯的屏蔽字符。除了繼承TextComponent類的方法,TextArea定義了兩個特殊的方法,如下:append(String s)在當(dāng)前文本區(qū)域已有文本的后面添加字符串參數(shù)s指定的文本內(nèi)容;insert(String s, int index)將字符串s插入到已有文本的指定序號處。(3) 事件響應(yīng)TextField和TextArea的事件響應(yīng)首先由它們的父類TextComponent決定。TextComponent的事件響應(yīng)如下:TextComponent可引發(fā)一種事件:當(dāng)用戶修改文本區(qū)

45、域中的文本,如做文本的添加、刪除、修改等操作時,將引發(fā)TextEvent對象代表的文本改變事件。在此基礎(chǔ)上TextField還比TextArea多產(chǎn)生一種事件,當(dāng)用戶在文本框中按回車時,將引發(fā)代表動作事件的ActionEvent事件。TextArea不能產(chǎn)生ActionEvent事件,也沒有addActionListener( )方法。若需響應(yīng)上述兩類事件,則需把文本框加入實現(xiàn)了TextListener接口的文本改變事件監(jiān)聽者和實現(xiàn)了ActionListener接口的動作事件監(jiān)聽者: textField1.addTextListener(this); textField1.addActionL

46、istener(this);在監(jiān)聽者內(nèi)部分別定義響應(yīng)文本改變事件和動作事件的方法: public void textValueChanged(TextEvent e); public void actionPerformed(ActionEvent e);來響應(yīng)文本框引發(fā)的文本改變事件和動作事件。調(diào)用e.getSource( )可獲得引發(fā)該事件的文本框的對象引用。調(diào)用該文本框的方法,可獲得改變后的文本內(nèi)容:String afterChange = (TextField)e.getSource( ).getText( );對于動作事件,同樣可通過調(diào)用e.getSource( )方法獲得用戶輸入回

47、車的那個文本框的對象引用。import java.applet.*;import java.awt.*;import java.awt.event.*;public class UsedTextComponentEvent extends Applet implements TextListener,ActionListener TextField tf; TextArea ta; public void init( ) tf = new TextField(45); ta = new TextArea(10,45); add(tf); add(ta); tf.addActionListene

48、r(this); tf.addTextListener(this); public void textValueChanged(TextEvent e) if(e.getSource( )=tf) ta.setText(TextField)e.getSource( ).getText( ); public void actionPerformed(ActionEvent e) if(e.getSource( )=tf) ta.setText(); 例 7-7 UsedTextComponentEvent.java7.7 單、復(fù)選按鈕,列表與選擇事件 1. 選擇事件(ItemEvent)Item

49、Event類只包含代表選擇項的選中狀態(tài)發(fā)生變化的事件ITEM-STATE-CHANGED。引發(fā)這類事件的動作包括:(1) 改變列表類List對象選項的選中或不選中狀態(tài)。(2) 改變下拉列表類Choice對象選項的選中或不選中。(3) 改變復(fù)選按鈕類Checkbox對象的選中或不選中狀態(tài)。(4) 改變檢測盒菜單項CheckboxMenuItem對象的選中或不選中狀態(tài)。ItmeEvent類的主要方法:(1) public ItemSelectable getItemSelectable( )返回引發(fā)選中狀態(tài)變化事件的事件源,例如,選項變化的List對象或選中狀態(tài)變化的Checkbox對象,這些能引

50、發(fā)選中狀態(tài)變化事件的都是實現(xiàn)了ItemSelectable接口的類的對象,包括List對象、Choice對象、Checkbox對象等。getItemSelectable( )返回這些類的對象引用。(2) public Object getItem( )返回引發(fā)選中狀態(tài)變化事件的具體選擇項,如選中Choice的具體item,通過調(diào)用這個方法可知用戶選中了哪個選項。(3) public int getStateChange( )返回具體的選中狀態(tài)變化類型,它的返回值在ItemEvent類的幾個靜態(tài)常量列舉的集合之內(nèi): ItemEvent.SELECTED: 代表選項被選中。 ItemEvent.D

51、ESELECTED:代表選項被放棄不選。2. 復(fù)選按鈕(Checkbox)(1) 創(chuàng)建復(fù)選按鈕也叫檢測盒,用Checkbox類的對象表示。創(chuàng)建復(fù)選按鈕對象時可指明其文本說明標(biāo)簽,該文本標(biāo)簽簡要地說明了檢測盒的意義和作用。Checkbox backg = new Checkbox(背景色);(2) 常用方法每個復(fù)選按鈕都兩種狀態(tài):被選中的check狀態(tài),未被選中的uncheck狀態(tài),復(fù)選按鈕都只處于這兩種狀態(tài)之一。查看點擊選擇了復(fù)選按鈕,可調(diào)用Checkbox的方法getState( )。若被選中,則返回true,否則返回false。調(diào)用Checkbox的另一個方法setState( )可以用程

52、序設(shè)置是否選中復(fù)選按鈕。下面的語句使Checkbox處于選中狀態(tài)。 backg.setState( true ); (3) 事件響應(yīng)當(dāng)用戶點擊檢測盒使其選中狀態(tài)發(fā)生變化時會引發(fā)ItemEvent類代表的選擇事件。下面的語句: backg.addItemListener(this);把backg注冊給ItemEvent事件的監(jiān)聽者ItemListener。則系統(tǒng)自動調(diào)用ItemListener中的方法:public void itemStateChanged(ItemEvent e) ;來響應(yīng)復(fù)選按鈕的狀態(tài)改變。凡是實現(xiàn)了ItemListener接口的監(jiān)聽者,例如包容復(fù)選按鈕的容器,需要具體實現(xiàn)

53、此方法。此方法的方法體通常包括如下語句:e.getItemSelectable( ):獲得引發(fā)選擇事件的事件源對象引用e.getState( )獲取選擇事件之后的狀態(tài)。注意:getItemSelectable( )方法的返回值是實現(xiàn)了Selectable接口的對象,需將它強制轉(zhuǎn)化成真正的事件源對象類型。例如:(Checkbox)e.getItemSelectable( ).getState( );(Checkbox)e.getItemSelectable( ).setState(false); 例 7-8 UsedTestCheckbox.javaimport java.applet.*;im

54、port java.awt.*;import java.awt.event.*;public class UsedTestCheckbox extends Applet implements ItemListener Checkbox ckb; Button btn; public void init( ) ckb = new Checkbox(背景色); btn = new Button(效果); add(ckb); add(btn); ckb.addItemListener(this); public void itemStateChanged(ItemEvent e) Checkbox

55、temp; if(e.getItemSelectable( ) instanceof Checkbox) temp = (Checkbox)(e.getItemSelectable( ); if(temp.getLabel( )=背景色) if(temp.getState( ) btn.setBackground(Color.cyan); else btn.setBackground(Color.gray); 3. 單選按鈕組(CheckboxGroup)(1) 創(chuàng)建Checkbox提供“二選一”的機(jī)制。若實現(xiàn)“多選一”,可用單選按鈕組。單選按鈕組是一組Checkbox的集合,用Checkbo

56、xGroup類的對象表示。每個Checkbox對應(yīng)一種可能的取值情況。例:如下創(chuàng)建的單選按鈕組代表了三種字體風(fēng)格。style = new CheckboxGroup( );p = new Checkbox(普通,true,style);b = new Checkbox(黑體,false,style);i = new Checkbox(斜體,false,style); 把CheckboxGroup加入容器時需把每個單選按鈕逐個加入到容器中,而不能使用CheckboxGroup對象一次性地加入。加入上面的單選按鈕需引用如下的語句: add(p); add(b); add(i); (2) 常用方法單

57、選按鈕的選擇是互斥的。調(diào)用CheckboxGroup的getSelectedCheckbox( ) :獲取選擇了哪個按鈕,并返回用戶選中的Checkbox對象,再調(diào)用該對象的方法getLabel( ) 可知用戶選擇了什么信息。CheckboxGroup的setSelectedCheckbox( ) 用于指定單選按鈕組中的某個按鈕。例如,下面的語句說明字體的風(fēng)格為斜體。 sex.setSelectedCheckbox( i );另外,也可直接使用按鈕組中的Checkbox單選按鈕的方法。直接調(diào)用 i.getState( );可知這個按鈕是否被選中。如果該按鈕被選中,則其他按鈕一定處于未選中狀態(tài)。

58、單選按鈕組中可包括兩個或更多的單選按鈕。(3) 事件響應(yīng)CheckboxGroup類不是java.awt.*包中的類,它是Object的直接子類,所以按鈕組不能響應(yīng)事件,但按鈕組中的每個按鈕可以響應(yīng)ItemEvent類的事件。單選按鈕組中的每個單選按鈕都是Checkbox對象,它們對事件的響應(yīng)與檢測盒對事件的響應(yīng)相同。 例 7-9 UsedCheckboxgroup.javaimport java.applet.*;import java.awt.*;import java.awt.event.*;public class UsedCheckboxgroup extends Applet im

59、plements ItemListener CheckboxGroup style; Checkbox p,b,i; Button btn; public void init( ) style = new CheckboxGroup( ); p = new Checkbox(普通,true,style); b = new Checkbox(黑體,false,style); i = new Checkbox(斜體,false,style); btn = new Button(效果); add(p); add(b); add(i); add(btn); p.addItemListener(this

60、); b.addItemListener(this); i.addItemListener(this); public void itemStateChanged(ItemEvent e) Checkbox temp; Font oldF = btn.getFont( ); if(e.getItemSelectable( ) instanceof Checkbox) temp = (Checkbox)(e.getItemSelectable( ); if(temp.getLabel( )=普通) btn.setFont(new Font(oldF.getName( ),Font.PLAIN,o

溫馨提示

  • 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

提交評論