




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第8章 圖形用戶界面的設計與實現(xiàn)本章介紹Java基本的圖形編程知識,包括窗口的顯示、文字和圖像的顯示、事件處理以及圖形用戶界面中常用的組件等內(nèi)容。本章要點8.1 Java圖形用戶界面概述8.2 標準組件8.3 簡單圖形用戶界面8.4 Java事件處理8.5 布局管理8.6 常用標準組件8.7 Swing組件思考與練習88.1 Java圖形用戶界面概述圖形用戶界面(Graphics User Interface),簡稱GUI。使用圖形的方式,借助菜單、按鈕等標準界面元素和鼠標操作,幫助用戶方便地向計算機系統(tǒng)發(fā)出指令,啟動操作,并將系統(tǒng)運行的結果同樣以圖形方式顯示給用戶。Java1.0中出現(xiàn)了用來
2、生成圖形用戶界面的包是java.awt,簡稱抽象窗口工具集,即AWT(Abstract Window Toolkit)。它的設計目標是希望構建一個通用的GUI,使得利用它編寫的程序能夠運行在所有的平臺上,以實現(xiàn)Sun公司提出的口號“一次編寫,隨處運行”。在Java1.2中,Sun公司推出了新的用戶界面庫:Swing。相對AWT來說,Swing功能更強大、使用更方便,它的出現(xiàn)使得Java的圖形用戶界面上了一個臺階。但是,Swing并沒有代替AWT。在Java1.1中,AWT事件處理模型有了根本改變。Swing使用的仍然是Java1.1的事件處理模型。 java.awt包中提供了GUI設計所使用的
3、類和接口,如圖8-1中顯示了到主要類之間的關系。8.1 Java圖形用戶界面概述圖8-1 awt包中主要類之間的關系8.1 Java圖形用戶界面概述Java中設計和實現(xiàn)圖形用戶界面的工作主要有:1.創(chuàng)建組件(Component):創(chuàng)建組成界面的各種元素,如按鈕、文本框等。2.指定布局(Layout):根據(jù)具體需要排列組件的位置關系。3.響應事件(Event):定義圖形用戶界面的事件和各界面元素對不同事件的響應,從而實現(xiàn)圖形用戶界面與用戶的交互功能。Java中構成用戶界面的各種元素和成分可以分為三類:容器、控制組件和用戶自定義成分。1.容器容器是用來組織其他界面成份和元素的單元。一般說來,一個應
4、用程序的圖形用戶界面首先對應于一個復雜的容器,如一個窗口。這個容器內(nèi)部將包含許多界面成份和元素,這些界面元素本身又可以是一個容器,這個容器將再進一步包含它的界面成份和元素,依次類推就構成一個復雜的圖形界面系統(tǒng)。8.1 Java圖形用戶界面概述容器的主要作用和特點有:(1)容器有一定的范圍。一般容器都是矩形的,容器范圍邊界可以用邊框框出來,有些則沒有可見的標記。(2)容器有一定的位置。這個位置可以是屏幕四角的絕對位置,也可以是相對于其他容器邊框的相對位置。(3)容器通常都有一個背景,這個背景覆蓋全部容器,可以透明,也可以指定一幅特殊的圖案,使界面生動化和個性化。(4)容器中可以包含其他的許多界面
5、成份和元素。當容器被打開顯示時,它上面的成份和元素也同時顯示出來;當容器被關閉和隱藏時,它所包含的成份和元素也一起被隱藏。(5)容器可以按一定的規(guī)則來安排它所包含的元素,如這些元素的相對位置關系、它們的前后排列關系等。(6)容器可能被包含在其他容器之中。8.1 Java圖形用戶界面概述2.控制組件與容器不同,控制組件是圖形用戶界面的最小單位之一,它里面不再包含其他的元素??刂平M件的作用是完成與用戶的一次交互,包括接受用戶的一個命令,接受用戶的一個文本輸入,向用戶顯示一段文本或一個圖形等。從某種程度上來說,控制組件是圖形用戶界面標準化的結果。3.用戶自定義成分除了標準的圖形界面元素,編程人員還可
6、以根據(jù)用戶需要設計一些用戶自定義的圖形界面成份,例如繪制一些幾何圖形,使用標志圖案等。用戶自定義成份由于不能像標準界面元素一樣被系統(tǒng)識別和承認,所以通常只能起到裝飾、美化等作用,而不能響應用戶的動作,不具有交互功能。 8.2 標準組件8.2.1 組件分類Java的圖形用戶界面的最基本組成部分是組件(Component),組件是一個可以以圖形化的方式顯示在屏幕上并能與用戶進行交互的對象,例如一個按鈕,一個標簽等。組件不能獨立地顯示出來,必須將組件放在一定的容器中才可以顯示出來。AWT組件分為容器(Container)類和非容器類組件兩大類。容器本身也是組件,但容器中可以包含其他組件,也可以包含其
7、他容器。非容器類組件的種類較多,如按鈕(Button)、標簽(Label)、文本類組件(TextComponent)等。java.awt包中的常用組件,如圖8-2和圖8-3所示。8.2 標準組件8.2.1 組件分類圖8-2 Component類的常用組件8.2 標準組件8.2.1 組件分類圖8-2 Component類的常用組件圖8-3 MenuComponent類的常用組件8.2 標準組件8.2.1 組件分類圖8-3 MenuComponent類的常用組件8.2 標準組件8.2.1 容器類組件容器分為兩種:頂層容器和非頂層容器兩大類。頂層容器是可以獨立的窗口,不需要其他組件支撐。頂層容器的類
8、是Window,Window的重要子類是Frame和Dialog。Window、Frame、Dialog和FileDialog都是一組大都含有邊框,并可以移動、放大、縮小、關閉的功能較強的容器。非頂層容器,不是獨立的窗口,它們必須位于窗口之內(nèi),非頂層容器包括Panel及ScrollPane等。Panel必須放在Window組件中才能顯示,它為一矩形區(qū)域,在其中可擺放其他組件,可以有自己的布局管理器。Panel的重要子類是Applet類。其中,Panel和Applet的容器都是無邊框的;ScrollPane是可以自動處理滾動操作的容器。容器類的特點是:容器中可以容納其他組件,使用add()方法,
9、可以將其他對象加入到容器中。加入到容器中后,組件的位置和尺寸由布局管理器決定。常用的Container類的方法如下:1.add(Component comp):將指定組件放到容器中2.remove(Component comp):刪除指定組件3.setLayout(LayoutManager mgr): 設置容器布局8.2 標準組件8.2.2 容器類組件 容器分為兩種:頂層容器和非頂層容器兩大類。頂層容器是可以獨立的窗口,不需要其他組件支撐。頂層容器的類是Window,Window的重要子類是Frame和Dialog。Window、Frame、Dialog和FileDialog都是一組大都含有
10、邊框,并可以移動、放大、縮小、關閉的功能較強的容器。非頂層容器,不是獨立的窗口,它們必須位于窗口之內(nèi),非頂層容器包括Panel及ScrollPane等。Panel必須放在Window組件中才能顯示,它為一矩形區(qū)域,在其中可擺放其他組件,可以有自己的布局管理器。Panel的重要子類是Applet類。其中,Panel和Applet的容器都是無邊框的;ScrollPane是可以自動處理滾動操作的容器。容器類的特點是:容器中可以容納其他組件,使用add()方法,可將其他對象加入到容器中。加入到容器中后,組件的位置和尺寸由布局管理器決定。常用的Container類的方法如下:1.add(Componen
11、t comp):將指定組件放到容器中2.remove(Component comp):刪除指定組件3.setLayout(LayoutManager mgr): 設置容器布局8.2 標準組件8.2.3 控制組件 基本的控制組件是用來提供人機交互的基本控制界面,包括:按鈕(Button)單選按鈕(CheckboxGroup)復選框(Checkbox)下拉列表框(Choice)畫板(Canvas)列表框(List)標簽(Label)文本組件(Textfield和TextArea)滾動條(Scrollbar)菜單(Menu)等等8.2 標準組件8.2.3 控制組件 使用控制組件,通常需要如下步驟:1
12、.創(chuàng)建某控制組件類的對象,指定其大小等屬性。2.使用某種布局策略,將該控制組件對象加入到某個容器中的某個指定位置處。3.將該組件對象注冊給它所能產(chǎn)生的事件對應的事件監(jiān)聽者,重載事件處理方法,實現(xiàn)利用該組件對象與用戶交互的功能。8.2 標準組件8.2.4 Component類 類java.awt.Component是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對象、大小、顯示位置、前景色和背景色、邊界、可見性等,因此許多組件類也就繼承了Component類的成員方法和成員變量,相應的成員方法包括:public void add(PopupMenu popup)
13、:在組件上加入一個彈出菜單public Color getBackground():獲得組件的背景色public Font getFont():獲得組件使用的字體public Color getForeground():獲得組件的前景色public Graphics getGraphics():獲得在組件上繪圖時需要使用的Graphics對象public void repaint(int x,int y,int width,int height):以指定的坐標點(x,y)為左上角,重畫組件中指定寬度(width)、指定高度(height)的區(qū)域public void setBackground
14、(Color c):設置組件的背景色public void setEnabled(boolean b):設置組件的使能狀態(tài)。參數(shù)b為true則組件使能,否則組件不使能。只有使能狀態(tài)的組件才能接受用戶輸入并引發(fā)事件public void setFont(Font f):設置組件使用的字體public void setSize(int width,int height):設置組件的大小public void setVisible(boolean b):設置組件是否可見的屬性。參數(shù)b為true時,組件在包括它的容器可見時也可見;否則組件不可見public void setForeground(Col
15、or c):設置組件的前景色public void requestFocus():使組件獲得焦點 8.2 標準組件8.2.4 Component類 類java.awt.Component是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對象、大小、顯示位置、前景色和背景色、邊界、可見性等,因此許多組件類也就繼承了Component類的成員方法和成員變量,相應的成員方法包括:public void add(PopupMenu popup):在組件上加入一個彈出菜單public Color getBackground():獲得組件的背景色public Font ge
16、tFont():獲得組件使用的字體public Color getForeground():獲得組件的前景色public Graphics getGraphics():獲得在組件上繪圖時需要使用的Graphics對象public void repaint(int x,int y,int width,int height):以指定的坐標點(x,y)為左上角,重畫組件中指定寬度(width)、指定高度(height)的區(qū)域8.2 標準組件8.2.4 Component類 public void setBackground(Color c):設置組件的背景色public void setEnable
17、d(boolean b):設置組件的使能狀態(tài)。參數(shù)b為true則組件使能,否則組件不使能。只有使能狀態(tài)的組件才能接受用戶輸入并引發(fā)事件public void setFont(Font f):設置組件使用的字體public void setSize(int width,int height):設置組件的大小public void setVisible(boolean b):設置組件是否可見的屬性。參數(shù)b為true時,組件在包括它的容器可見時也可見;否則組件不可見public void setForeground(Color c):設置組件的前景色public void requestFocus(
18、):使組件獲得焦點 8.3 簡單圖形用戶界面8.3.1 Frame與Panel一般我們要生成一個窗口,通常是用Window的子類Frame來進行實例化,而不是直接用到Window類。Frame的外觀就像我們平常在windows系統(tǒng)下見到的窗口,有標題、邊框、菜單、大小等等。每個Frame的對象實例化以后,都是沒有大小和不可見的,因此必須調(diào)用setSize( )來設置大小,調(diào)用setVisible(true)來設置該窗口為可見的。另外,AWT在實際的運行過程中是調(diào)用所在平臺的圖形系統(tǒng),因此同樣一段AWT程序在不同的操作系統(tǒng)平臺下運行所看到的圖形系統(tǒng)是不一樣的。例如在windows下運行,則顯示的
19、窗口是windows風格的窗口;而在UNIX下運行時,則顯示的是UNIX風格的窗口。8.3 簡單圖形用戶界面8.3.1 Frame與PanelFrame類具有以下特點:Frame類是Window類的直接子類;Frame對象顯示的效果是一個“窗口”,帶有標題和尺寸;Frame默認初始化為不可見的,可使用setVisible(true)方法使之變?yōu)榭梢?;默認的布局管理器是BorderLayout,可使用setLayout()方法改變其默認布局管理器。Frame的構造方法有:Frame f=new Frame();Frame f=new Frame(String s);s為Frame的標題字符串。8
20、.3 簡單圖形用戶界面8.3.1 Frame與Panel使用Frame窗口時將會用到的幾個方法:1.設置窗口大小setSize()這個方法用來設置窗口的大小,如下所示:void setSize(int newWidth, int newHeight)void setSize(Dimension newSize)窗口的新的大小在變量newWidth和newHeight中被指定,或者在來自Dimension類的newSize對象的width和height這兩個成員變量中被指定。這些大小使用像素為單位。2.獲得當前的窗口大小getSize()這個方法被用來獲得當前的窗口大小,如下所示:Dimensi
21、on getSize()這個方法返回一個Dimension對象,在這個對象的成員變量width和height中存放著當前窗口的大小。8.3 簡單圖形用戶界面8.3.1 Frame與Panel3.隱藏和顯示一個窗口當一個frame窗口被創(chuàng)建以后,這個窗口默認是不可見的,除非你調(diào)用它的setVisible()方法。如下所示:void setVisible(boolean visibleFlag)如果這個方法的參數(shù)是true,那么調(diào)用它的組件是可見的。否則,就被隱藏。4.設置窗口標題你可以通過使用setTitle()方法來改變一個frame窗口的標題。如下所示:void setTitle(Strin
22、g newTitle)在這里,參數(shù)newtitle是窗口的新標題。8.3 簡單圖形用戶界面8.3.1 Frame與Panel5.關閉frame窗口當使用一個frame窗口時,你的程序必須在它被關閉時通過調(diào)用setVisible(false)方法來將窗口從屏幕中除去。為了截獲窗口關閉事件,你必須實現(xiàn)WindowListener監(jiān)聽器接口的windowClosing()方法。在windowClosing()方法中,你必須將窗口從屏幕中除去。在下一節(jié)中將講解這種技術。 8.3 簡單圖形用戶界面8.3.1 Frame與PanelPanel類具有以下特點:Panel不是頂層窗口,它必須位于窗口或其他容器
23、之內(nèi);Panel可以容納其他組件,在程序中經(jīng)常用于布局和定位;Panel默認的布局管理器是FlowLayout,可使用setLayout()方法改變其默認布局管理器;Panel可以采用和所在容器不同的布局管理器。8.3 簡單圖形用戶界面8.3.2 字體設置 Java中用Font類來設置字體。一個Font類的對象表示了一種字體顯示效果,包括字體類型、字型和字號。Font類的構造方法如下:Font(String name,int style,int size);其中,name代表字體名稱,例如,可以是Helvetica、TimesRoman、Courier、宋體、楷體等。style代表字體風格,有
24、三種字體風格靜態(tài)變量,即:Font.BOLD:黑體Font.ITALIC:斜體Font.PLAIN:正常字體8.3 簡單圖形用戶界面8.3.2 字體設置 它們可以互相組合使用,例如:Font.BOLD+Font.ITALICsize代表字體大小,單位是point,一個point是1/72英寸。例如:Font f = new Font(TimesRoman, Font.PLAIN, 14);在組件中顯示所用的字體可以用setFont()方法來設置。這個方法的參數(shù)應當是java.awt.Font類的實例。例如,使用Graphics類的參數(shù)g:g.setFont(f);設置按鈕上的字體:Button
25、 btn =new Button();Btn.setFont(f);書中表8-1列出了Font類的主要方法。8.3 簡單圖形用戶界面8.3.2 字體設置 另外,Java提供了幾種文字的輸出方法:1.drawBytes(byte bytes,int offset,int number,int x,int y):字節(jié)輸出方法2.drawChars(char chars,int offset,int number,int x,int y):字符輸出方法3.drawString(String string,int x,int y):字符串輸出方法其中,x、y代表輸出字符的起始坐標位置,bytes是字節(jié)
26、數(shù)組,chars是字符數(shù)組,string是字符串,offset是數(shù)組的起始下標,number是要繪制的元素個數(shù)。這三個方法都屬于Graphics類,使用當前的顏色和字體來繪制字符。其中,drawstring()是最常用的方法。不同的系統(tǒng)中安裝了不同的字體,為了得到本系統(tǒng)中所有已安裝的字體,我們可以通過GraphicsEnvironment類的getAvailableFontFamilyNames方法來實現(xiàn)。該方法返回一個字符串數(shù)組,數(shù)組內(nèi)包含所有可用的字體名。8.3 簡單圖形用戶界面8.3.3 繪制簡單圖形繪制圖形和文字都要用到Graphics類。Graphics是java.awt包中的一個類
27、,其中包含了很多繪制圖形和文字的方法,所以需要加載import java.awt.*。由于Applet程序本身是圖形界面,對于圖形、圖像的處理非常的方便,所以以下的程序主要使用Applet程序,需要加載import java.applet.*。Graphics類主要的方法如書中表8-2所示。 8.3 簡單圖形用戶界面8.3.3 繪制簡單圖形 繪制線段Java定義的窗口工作區(qū)是以整個屏幕的左上角為坐標原點(0,0),以象素為單位。繪制線段有drawLine()、drawPolyline()兩種方法。1.drawLine()用來繪制一段直線。其語法如下:drawLine(int x1, int y
28、1, int x2, int2);其中x1, y1代表選段的起點。 x2,y2代表線段的終點。2.drawPolyline()用來繪制多邊形線段。其語法如下:drawPolyline(int x,int y,int npoints);其中x、y為多邊形線段頂點坐標的位置。npoints表示多邊形頂點的數(shù)目。8.3 簡單圖形用戶界面8.3.3 繪制簡單圖形 繪制矩形前面介紹的drawPolyline()若將頂點坐標設定,使畫出線段距離大小一樣,就可以畫出一個正方形,也可以畫出一個矩形。在Java語言中,繪制矩形有clearRect()、clipRect()、drawRect()、fillRect
29、()和setClip()等方法。下面分別介紹如下:1.clearRect()用來清除矩形。其語法如下:clearRect(int x,int y,int w,int h);其中x, y為清除矩形左上角頂點的坐標。w為矩形的寬度,h為矩形的高度。2.clipRect()用來限制矩形的圖形范圍。其語法如下:clipRect(int x,int y,int w,int h);其中x, y為限制矩形圖形范圍左上角頂點的坐標。 w為矩形的寬度,h為矩形的高度。8.3 簡單圖形用戶界面8.3.3 繪制簡單圖形 繪制矩形3.drawRect()用來繪制一個矩形。其語法如下:drawRect(int x, i
30、nt y, int w, int h);其中x,y為繪制矩形左上角頂點的坐標。w為矩形的寬度,h為矩形的高度。4.fillRect()用來繪制一個矩形并在其封閉空間填充顏色。其語法如下:fillRect(int x, int y, int w, int h);其中x,y為繪制填滿矩形的左上角頂點的坐標。w為矩形的寬度,h為矩形的高度。5.setClip()用來設定限制圖形范圍的矩形。其語法如下:setClip(int x, int y, int w, int h);其中x,y為設定限制圖形范圍矩形的左上角頂點的坐標。w為矩形的寬度,h為矩形的高度。8.3 簡單圖形用戶界面8.3.3 繪制簡單圖
31、形 繪制圓矩形繪制圓矩形有drawRoundRect()和fillRoundRect()等方法。1.drawRoundRect()用來繪制圓矩形。其語法如下:drawRoundRect(int x, int y, int w, int h);其中x, y為繪制圓矩形左上角的坐標。w為圓矩形的寬度,h為圓矩形的高度。2.fillRoundRect()用來繪制圓矩形,并在其封閉空間填充顏色。其語法如下:fillRoundRect(int x, int y, int w, int h, int arcw, int arch);其中x, y為繪制圓矩形左上角的坐標。w為圓矩形的寬度,h為圓矩形的高度。
32、arcw為圓矩形圓弧的寬度,arch為圓矩形圓弧的高度。8.3 簡單圖形用戶界面8.3.3 繪制簡單圖形 繪制弧形繪制弧形有drawArc()和fillArc()等方法。1.drawArc()用于繪制弧形。其語法如下:drawArc(int x, int y, int w, int h, int p, int q);其中x, y為繪制弧形的中心。w為弧形的寬度,h為弧形的高度。p為弧形的起始角度。q為弧形的弧度。q為正,表順時針方向;q為負,表逆時針方向。2.fillArc()用于繪制填滿內(nèi)部的弧形。其語法如下:fillArc(int x,int y, int w,int h,int p,in
33、t q);其中x, y為繪制弧形的中心。w為弧形的寬度,h為弧形的高度。p為弧形的起始角度。 q為弧形的弧度。 q為正,表順時針方向;q為負,表逆時針方向。8.3 簡單圖形用戶界面8.3.3 繪制簡單圖形 繪制橢圓形繪制橢圓形有drawOval()和fillOval()等方法。1.drawOval():用于繪制橢圓形。其語法如下:drawOval(int x, int y, int w, int h,);其中x, y為繪制橢圓形的圓心。w為橢圓形的寬度,h為橢圓形的高度。2.fillOval():用于繪制填滿內(nèi)部的橢圓形。其語法如下:fillOval(int x,int y, int w,in
34、t h);其中x, y為繪制橢圓形的圓心。w為橢圓形的寬度,h為橢圓形的高度。 8.3 簡單圖形用戶界面8.3.4 設置顏色繪圖離不開顏色,圖形中的顏色分前景色和背景色。顯示的字符和圖形的顏色用Color類的對象控制,每個Color對象代表一種顏色,用戶可以直接使用Color類中定義好的顏色常量,也可以通過調(diào)配紅、綠、藍三原色的比例創(chuàng)建自己的Color對象。Color類中定義了三種構造方法:Color(float r,float g,float b):指定三原色的浮點值,每個參數(shù)的取值范圍在0.0至1.0之間。Color(int r,int g,int b):指定三原色的整數(shù)值,每個參數(shù)的取值
35、范圍在0至288之間。Color(int rgb):指定一個整數(shù)代表三原色的混合值,1623比特位代表紅色,818比特位代表綠色,07比特位代表藍色。不論使用哪個構造方法創(chuàng)建Color對象,都需要指定新建顏色中紅、綠、藍三色的比例。Color類中定義了13種顏色常量,使用時只需加上Color前綴,十分方便。Color的顏色常量如書中表8-3所示 。8.3 簡單圖形用戶界面8.3.4 設置顏色對于GUI的控制組件,它們有四個與顏色有關的方法分別用來設置和獲取組件的背景色和前景色:public void setBackground(Color c);public Color getBackgrou
36、nd();public void setForeground();public getForeground();方法的參數(shù)是java.awt.Color類的實例。你也可以使用顏色常量,如Color.red,Color.blue等。例如,你可以創(chuàng)建一個特定的顏色:int r = 288, g = 288, b = 0;Color c = new Color(r, g, b);上述構造方法根據(jù)指定的紅色、綠色和藍色的數(shù)值(它們的范圍都是0288)來創(chuàng)建一個顏色。8.3 簡單圖形用戶界面8.3.5 顯示圖像圖像是由專門的軟件或截取圖像的工具生成的文件。在Java的Graphics類中不僅提供了大量繪
37、制圖形的方法,還提供了一些方法來顯示圖像。我們需要圖像文件在Java程序運行時,找到它的存儲位置,將它加載到內(nèi)存里,然后在適當?shù)臅r候通過Graphics類中drawImage()方法將它顯示在屏幕上就可以了。getImage()方法有兩個參數(shù),第一個參數(shù)是圖像文件所在的URL(統(tǒng)一資源定位器)地址。在上面例子中由于圖像文件與HTML文件保存在同一個路徑下,所以使用Applet類的另一個方法getCodeBase()或getDocumentBase()來獲取含有該Applet類的HTML文件的URL地址。getImage()方法的第二個參數(shù)是圖像文件的文件名。8.3 簡單圖形用戶界面8.3.5
38、顯示圖像由于Java是面向網(wǎng)絡的,因此圖像文件的存儲位置并不局限于本地計算機的磁盤目錄,大部分是直接讀取web服務器上的圖像文件。getImage()方法返回一個Image對象,它的調(diào)用格式為:Image getImage(URL url)Image getImage(URL ur1, String name)其中url是一個URL類的對象,代表一個網(wǎng)絡地址,例如我們訪問搜狐網(wǎng)站服務器指定位置的一幅圖片:getImage(new URL(/graphics/a.jpg);drawImage()方法是Graphics類中用來顯示圖像的方法。它可以將Image對象關聯(lián)的圖像顯示在Applet的指定
39、位置。8.3 簡單圖形用戶界面8.3.5 顯示圖像drawImage()方法的調(diào)用格式如下:boolean drawImage(Image img, int xr int y, ImageObserver observer)boolean drawImage (Image img, int x, int y, Color bgcolor, ImageObserverobserver)img是保存圖像的Image對象。x,y是圖像的左上角的坐標,它們決定了圖像在容器中顯示位置。bgcolor是圖像顯示區(qū)域的背景色。observer是圖像加載跟蹤器,通常將該參數(shù)指定為this,即由Applet負責
40、跟蹤圖像的加載情況。drawImage()方法可以不失真地按比例對圖像進行縮放。Java可以識別的圖像文件格式有jpg、gif、jpeg等。 8.4 Java事件處理 8.4.1 Java事件處理機制如果用戶在用戶界面執(zhí)行了一個動作,這將導致一個事件的發(fā)生。事件是描述發(fā)生了什么的對象。在Java中,定義了各種不同類型的事件類,用來描述各種類型的用戶操作。事件是由事件源產(chǎn)生的,事件的產(chǎn)生者稱為事件源。例如,在Button組件上點擊鼠標會產(chǎn)生以這個Button為源的一個事件:ActionEvent。 事件源擁有自己的方法,我們通過它向其注冊事件監(jiān)聽器。事件監(jiān)聽器是一個類的實例,這個類實現(xiàn)了一個特殊
41、的接口,稱為Listener interface。當事件源產(chǎn)生了一個事件以后,事件源就會發(fā)送通知給相應的事件監(jiān)聽器,監(jiān)聽器對象根據(jù)事件對象內(nèi)封裝的信息,決定如何響應這個事件。8.4 Java事件處理 8.4.1 Java事件處理機制所有的組件都從Component類中繼承了將事件處理授權給監(jiān)聽器的方法:addXXXListener(ListenerType listener):/將事件源注冊給事件處理程序(監(jiān)聽者)removeXXXListener(ListenerType listener):/取消事件源的注冊在Java中,所有的事件都定義在類庫java.awt.event中,用相應的類來表
42、達不同的事件,例如鍵盤事件類KeyEvent,鼠標事件類MouseEvent等。這些事件類都是從AWTEvent類派生而來的。事件類的繼承關系如圖8-9所示。8.4 Java事件處理 8.4.1 Java事件處理機制事件類的繼承關系如圖8-9所示。圖8-9 Java事件類的繼承關系圖8-9 Java事件類的繼承關系8.4 Java事件處理 8.4.1 Java事件處理機制AWT將事件分為兩類:1.語義(Semantic)事件:ActionEvent:對應按鈕點擊、菜單選擇、列表框選擇、在文本域中按回車鍵等。AdjustmentEvent:用戶調(diào)整滾動條。ItemEvent:用戶從一組選擇框或者
43、列表項中進行選擇。TextEvent:文本域或者文本框中的內(nèi)容發(fā)生改變。2.低級(Low-Level)事件:ComponentEvent:組件大小改變、移動、顯示或者隱藏。KeyEvent:鍵盤上的一個鍵被按下或者釋放。MouseEvent:鼠標按鍵被按下、釋放、鼠標移動或者拖動。FocusEvent:組件獲得焦點或者失去焦點。WindowEvent:窗口被激活、屏蔽、最小化、最大化或關閉。ContainerEvent:添加或者刪除一個組件。8.4 Java事件處理 8.4.2 按鈕點擊事件按鈕是最常用到的組件,因此它的事件處理是非常重要的。創(chuàng)建按鈕的方法是:Button MyButton =
44、 new Button(“Java”); 通過Container類的Add方法,將組件加入到該容器中。class MyPanel extends Panelpublic MyPanel()Button MyButton = new Button(“Java”);add(MyButton);8.4 Java事件處理 8.4.2 按鈕點擊事件然后為按鈕設置監(jiān)聽器。指定的監(jiān)聽器必須實現(xiàn)ActionListener接口的actionPerformed方法:public void actionPerformed(ActionEvent event)事件處理模型中的監(jiān)聽者都是通過實現(xiàn)在包java.awt.
45、event中提供的監(jiān)聽者接口來獲得的。每種事件都對應有相應的監(jiān)聽者接口,事件的處理方法都已經(jīng)在該接口中定義了。8.4 Java事件處理 8.4.3 捕獲窗口事件Frame對象是窗口事件(WindowEvent)的事件源,要指定一個監(jiān)聽器對象:MyWindowListener listener = .;frame.addWindowListener(listener); 監(jiān)聽器對象要實現(xiàn)WindowListener接口。WindowListener接口中共有七個方法,它們分別對應七個窗口事件:public interface WindowListenervoid windowOpened(Win
46、dowEvent e);void windowClosing(WindowEvent e);void windowClosed(WindowEvent e);void windowIconified(WindowEvent e);void windowDeiconified(WindowEvent e);void windowActivated(WindowEvent e);void windowDeactivated(WindowEvent e); 8.4 Java事件處理 8.4.3 捕獲窗口事件WindowListener接口實現(xiàn)方法是:定義一個類來實現(xiàn)WindowListener接口,
47、在需要的方法中添加我們需要的代碼,然后讓其他方法為空即可。class QuitWindow implements WindowListenerpublic void windowClosing(WindowEvent e)System.exit(0);void windowOpened(WindowEvent e) void windowClosed(WindowEvent e) void windowIconified(WindowEvent e) void windowDeiconified(WindowEvent e) void windowActivated(WindowEvent e
48、) void windowDeactivated(WindowEvent e) 使用以上代碼,我們可以關閉一個Frame窗口。 8.4 Java事件處理 8.4.4 鍵盤事件鍵盤事件對應著KeyEvent類,對應三個具體的事件:KEY_PRESSED(按下鍵)、KEY_RELEASED(松開鍵)、KEY_TYPED(擊鍵)。判斷一個KeyEvent類的對象到底代表哪種事件,可以用它的方法getID()的返回值與事件常量相比來得到。KeyListener接口中有三個方法:public void keyPressed(KeyEvente)public void keyReleased(KeyEve
49、nte)public void keyTyped(KeyEvente)8.4 Java事件處理 8.4.4 鍵盤事件Java對于用戶按鍵的處理過程:當前鍵盤狀態(tài)為小寫狀態(tài),要輸入一個大寫字母“A”,我們的操作過程為:先按住Shift鍵不放,再按下A鍵,然后松開。整個過程Java會產(chǎn)生五個事件:按下Shift鍵:為VK_SHIFT調(diào)用keyPressed方法;按下A鍵:為VK_A調(diào)用keyPressed方法;鍵入字符“A”:為字符“A”調(diào)用keyTyped方法;松開A鍵:為VK_A調(diào)用keyReleased方法;松開Shift鍵:為VK_SHIFT調(diào)用keyReleased方法。 8.4 Jav
50、a事件處理 8.4.5 鼠標事件鼠標事件對應MouseEvent類。它有兩個監(jiān)聽者接口與之對應,一個是MouseListener接口(它有五個事件);一個是MouseMotionListener接口(它有兩個事件)。MouseListener接口 :mousePressed:鼠標鍵被按下時調(diào)用;mouseReleased:鼠標鍵被釋放時調(diào)用;mouseClicked:合并上述兩個事件為一次鼠標點擊事件。mouseEntered:進入指定的區(qū)域。mouseExited:離開指定的區(qū)域。它們的參數(shù)是MouseEvent,通過getX和getY方法,能夠得到鼠標點擊時的鼠標指針x和y的坐標。通過ge
51、tClickCount方法,可以區(qū)別是單擊操作,還是雙擊操作。MouseMotionListener接口 :mouseMoved:鼠標移動;mouseDragged:用戶拖動鼠標。 8.4 Java事件處理 8.4.6 焦點事件如果某個組件能夠接收用戶按鍵,那么該組件就擁有焦點。擁有焦點的組件在顯示形式上與其他組件有一些差別:文本域內(nèi)會顯示光標;按鈕四周會顯示一個由虛線組成的矩形框??梢圆东@丟失的焦點事件來進行輸入的合法性檢查。如果輸入不合法,通過調(diào)用requestFocus方法把焦點重新移回到該文本域,提示用戶重新輸入: public void focusLost(FocusEvent ev
52、ent) if(event.getComponent()=passText&!event.isTemporary() /passText為需要進行合法性檢查的文本域 if(!isFormatValid(passText.getText()/ isFormatValid為自定義方法,用戶檢查合法性 passText.requestFocus();Java支持的事件類型很多,書中表8-4列出了Java中各個事件類型、接口及相關方法。 8.4 Java事件處理 一般說來,每個事件類都至少有一個監(jiān)聽者接口與之相對應,而事件類中的每個具體事件類型都有一個具體的抽象方法與之相對應。當具體事件發(fā)生時,這個事
53、件將被封裝成一個事件類的對象作為實際參數(shù)傳遞給與之對應的具體方法,由這個具體方法負責響應并處理發(fā)生的事件。在一個類中可以實現(xiàn)多個監(jiān)聽者接口,通過它可以同時監(jiān)聽同一個事件源上發(fā)生的多種事件。同時,通過事件可以獲得事件的詳細信息。8.4 Java事件處理 8.4.7 事件適配器由于通過實現(xiàn)接口XXXListener來完成事件處理時,要同時實現(xiàn)該接口中的所有方法。但是有時候,我們只是需要對其中的某些方法做處理,而不想實現(xiàn)所有的無關方法。因此,為了方便起見,Java為某些監(jiān)聽者接口提供了適配器類(XXXAdapter),當需要對某種事件進行處理時,只需讓事件處理類繼承事件所對應的適配器類,只重寫需要關
54、注的方法即可,而無關的方法就不必實現(xiàn)了。適配器是一個類而不是接口,因而處理事件的類只能繼承一個適配器。當該類需要處理多種事件時,通過繼承適配器類的方式是不行的。但可以基于適配器類,用內(nèi)嵌類(Inner Class)的方法來處理這種情況。事件適配器包括以下幾種:ComponentAdapter:組件適配器;ContainerAdapter:容器適配器;FocusAdapter:焦點適配器;KeyAdapter:鍵盤適配器;MouseAdapter:鼠標適配器;MouseMotionAdapter:鼠標運動適配器;WindowAdapter:窗口適配器; 8.5 布局管理在Java的GUI界面設計
55、中,布局控制是相當重要的一環(huán)節(jié)。將一個組件加入容器中時,布局控制決定了所加入的組件的大小和位置。而布局管理器能自動設定容器中的組件的大小和位置,當容器改變大小時,布局管理器能自動地改變其中組件的大小和位置。java.awt包中共定義了五種布局管理類,每個布局管理類對應一種布局策略,分別是FlowLayout,BorderLayout,CardLayout,GridLayout和GridBagLayout。下面將詳細討論這幾種布局管理器。8.5 布局管理8.5.1 FlowLayout類FlowLayout是容器Panel和Applet類默認使用的布局管理器,如果不專門為Panel或Applet
56、指定布局管理器,則它們就使用FlowLayout。FlowLayout對應的布局策略非常簡單。這種策略配置組件的方式是:1.組件按照加入的先后順序從左向右排列。2.一行排滿之后就下轉到下一行繼續(xù)從左至右排列。3.每一行中的組件都居中排列。在組件不多時,使用這種策略非常方便,但是當容器內(nèi)的GUI元素增加時,就顯得高地參差不齊。表8-5列出了FlowLayout的屬性。8.5 布局管理8.5.1 FlowLayout類對于使用FlowLayout的容器,加入組件使用如下簡單的命令:add(組件名);這些組件將順序的排列在容器中。如果一個容器原來不使用FlowLayout布局方式,現(xiàn)在要改為Flow
57、Layout布局策略,使用如下的語句:setLayout(new FlowLayout();setLayout()方法是所有容器的父類Container的方法,用于為容器設定布局。如果想將組件設定缺省居中的話,F(xiàn)lowLayout構造方法中的參數(shù)允許將組件左對齊或右對齊。對齊的值必須是FlowLayout.LEFT,F(xiàn)lowLayout.RIGHT,或FlowLayout.CENTER。例如:setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 40); 8.5 布局管理8.5.2 BorderLayout類BorderLayout是容器Frame和Di
58、alog默認使用的布局管理器。BorderLayout也是一種簡單的布局管理策略。它把容器內(nèi)的空間劃分成五個明顯的區(qū)域:東、南、西、北、中。北占據(jù)容器的上方,東占據(jù)容器的右側,南占據(jù)容器的下方,西占據(jù)容器的左側。中間區(qū)域是在東、南、西、北都填滿后剩下的區(qū)域。當窗口垂直延伸時,南、北、中區(qū)域也延伸;而當窗口水平延伸時,東、西、中區(qū)域也延伸。如果某個區(qū)域沒有分配組件,則其他組件可以占據(jù)它的空間。例如,如果北部沒有分配組件,則西部和東部的組件將向上擴展到容器的最上方。如果東部和西部沒有分配組件,則位于中部的組件將橫向擴展到容器的左右邊界。書中表8-8列出了BorderLayout的屬性。8.5 布局
59、管理8.5.3 GridLayout類GridLayout布局方式可以使容器中的各組件呈網(wǎng)格狀分布。容器中各組件的高度和寬度相同,當容器的尺寸發(fā)生變化時,各組件的相對位置不變,但各自的尺寸會發(fā)生變化。各組件的排列方式為:從上到下,從左到右。與BorderLayout類相類似,如果想在一個網(wǎng)格單元中添加多個組件,則必須先在該網(wǎng)格單元放一個容器,再將多個組件放在該容器中。書中表8-11列出了GridLayout的構造方法。 8.5 布局管理8.5.4 CardLayout類CardLayout類在處理容器內(nèi)的組件時,容器表面上可以容納多個組件。但在同一個時間容器只能從這些組件中選出一個來顯示,就像
60、一副撲克牌每次只能顯示最上面的一張一樣,而且可以向前翻閱組件,也可以向后翻閱組件書中表8-13列出了CardLayout的構造方法。8.5 布局管理8.5.5 GridBagLayout類GridBagLayout布局方式是AWT中最靈活、同時也是最復雜的一種布局方式。與GridLayout相同,它也是將容器中的組件按照行、列的方式放置,但各組件所占的空間可以互不相同。GridBagLayout根據(jù)對每個組件所施加的空間限制、每個組件自身所設定的最小尺寸和最佳尺寸來為每個組件分配空間。對組件施加空間限制是通過類GridBagConstraints來實現(xiàn)的。 8.6 常用標準組件組件允許用戶同應
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- JB/T 20208-2024大蜜丸涼丸機
- 統(tǒng)編版二年級語文下冊期末達標測試卷(模擬沖刺)(含答案)
- 湖南省岳陽市臨湘市2024-2025學年高三下學期入學考試物理試題(含答案)
- 2025年軍隊文職人員招聘之軍隊文職政治學能力提升試卷A卷附答案
- 2023年遼寧省中考地理試卷(含答案)
- 2021-2022學年廣東省廣州四中教育集團七年級(下)期中數(shù)學試卷(含答案)
- 護師房顫考試題及答案
- 2025年法律知識競賽判斷題庫及答案
- 智能能源管理平臺開發(fā)合作協(xié)議
- 工業(yè)制造業(yè)技術創(chuàng)新成果展示表
- 2024年資格考試-良好農(nóng)業(yè)規(guī)范認證檢查員考試近5年真題集錦(頻考類試題)帶答案
- 2024年普通高等學校招生全國統(tǒng)一考試·新課標卷(生物)附試卷分析
- 優(yōu)化熱處理工藝的機器學習
- 2024年1月時政熱點題庫及答案
- 2023年山東省夏季普通高中學業(yè)水平合格考試會考生物試題及參考答案
- 非正常接發(fā)列車作業(yè)標準
- 體育室內(nèi)課-體育大富翁
- 2024年國家保安員資格考試題庫及參考答案(完整版)
- DL-T692-2018電力行業(yè)緊急救護技術規(guī)范
- 消防員訓練傷的預防及恢復課件
- 醫(yī)院感染防控基本知識2
評論
0/150
提交評論