第07章+圖形用戶界面的創(chuàng)建(精簡(jiǎn)版)_第1頁
第07章+圖形用戶界面的創(chuàng)建(精簡(jiǎn)版)_第2頁
第07章+圖形用戶界面的創(chuàng)建(精簡(jiǎn)版)_第3頁
第07章+圖形用戶界面的創(chuàng)建(精簡(jiǎn)版)_第4頁
第07章+圖形用戶界面的創(chuàng)建(精簡(jiǎn)版)_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章圖形用戶界面的創(chuàng)立本章主要內(nèi)容圖形用戶界面的概述

常用容器類與容器布局管理事件處理7.1圖形用戶界面的概述圖形用戶界面〔GUI〕是用戶與程序交互的窗口,設(shè)計(jì)和實(shí)現(xiàn)圖形用戶界面時(shí),主要包含兩項(xiàng)內(nèi)容?!?〕創(chuàng)立圖形界面中需要的元素,進(jìn)行相應(yīng)的布局。〔2〕定義界面元素對(duì)用戶交互事件的響應(yīng)以及對(duì)事件的處理。用戶與計(jì)算機(jī)系統(tǒng)(各種程序)交互的接口AWTSwingAWTGUI的根本類庫位于java.awt包中,這個(gè)包被稱為抽象窗口工具箱(AbstractWindowToolkit),AWT按照面向?qū)ο蟮乃枷雭韯?chuàng)立GUI,它提供了容器類,眾多的組件類和布局管理器類。AWT依賴于本地操作系統(tǒng)以下圖顯示了AWT的類層次結(jié)構(gòu)。AWT工具集簡(jiǎn)介java.awt包中包含了一個(gè)完整的類集以支持GUI程序的設(shè)計(jì):事件類字體類GraphicsComponent顏色類布局管理類java.lang.ObjectCheckboxContainerButton…WindowPanelAppletDialogFrameList圖象類菜單類ScrollpaneAWT創(chuàng)立GUI通過java.awt包容器組件布局管理器字體事件圖形和繪制方法包含AWT容器組件以圖形表示的對(duì)象允許用戶交互創(chuàng)立并構(gòu)造用于選擇新字體的對(duì)象用于用戶和系統(tǒng)交互AWT包含內(nèi)容使用AWT圖形方法相對(duì)于窗口繪制圖形定義GUI組件的位置AWT〔重量級(jí)組件〕7.1.1AWT與Swing為了使用Java創(chuàng)立的圖形界面也能夠跨平臺(tái),即在不同操作系統(tǒng)中保持相同的外觀,從JDK1.2版本開始引入了Swing組件,這些Swing組件位于javax.swing包中,成為JDK根底類庫的一局部。Swing組件是用純Java語言編寫而成的,不依賴于本地操作系統(tǒng)的GUI,Swing組件可以跨平臺(tái)運(yùn)行。Swing創(chuàng)立GUI通過Javax.swing包Swing包含內(nèi)容容器組件可改變的外觀Java2D圖形繪制包含Swing組件以圖形表示的對(duì)象允許用戶交互使用Java2D繪制圖形可更換圖形界面的風(fēng)格Swing〔輕量級(jí)組件,純Java組件〕AWT和Swing是合作關(guān)系,而不是用Swing取代了AWTSwing組件都是AWT的Container類的直接子類和間接子類。Swing組件以"J"開頭,除了有與AWT類似的組件外,還增加了一個(gè)豐富的高層組件集合,如表格〔JTable〕、樹〔JTree〕。7.1.1AWT與SwingAWT與Swing頂層窗口類之間的關(guān)系分為三類:容器、控制組件和用戶自定義成分〔1〕容器容器是用來組織或容納其他界面成分和元素的組件?!?〕組件它是圖形用戶界面的最小單位之一,它里面不再包含其他的成分?!?〕用戶自定義成分編程人員還可以根據(jù)用戶的需要,使用各種字型、字體和色彩設(shè)計(jì)一些幾何圖形、標(biāo)志圖案等。圖形用戶界面元素分類使用組件,通常需要如下的步驟:①創(chuàng)立某控制組件類的對(duì)象,指定其大小等屬性。②使用某種布局策略,將該控制組件對(duì)象參加到某個(gè)容器中的指定位置處。③將該組件對(duì)象注冊(cè)給所能產(chǎn)生的事件對(duì)應(yīng)的事件監(jiān)聽程序,重載事件處理方法,實(shí)現(xiàn)利用該組件對(duì)象與用戶交互的功能。7.2常用容器類與容器布局管理容器(Container)實(shí)際上是Component的子類,因此容器本身也是一個(gè)組件,具有組件的所有性質(zhì),另外還具有容納其它組件和容器的功能。主要功能:組件的管理和布局管理頂層容器:JFrame:用于框架窗口的類,此窗口帶有邊框、標(biāo)題、用于關(guān)閉和最小化窗口的圖標(biāo)等。帶GUI的應(yīng)用程序通常至少使用一個(gè)框架窗口。JDialog:用于對(duì)話框的類。JApplet:用于使用Swing組件的JavaApplet的類。中間層容器:JPanel:最靈活、最常用的中間容器。JScrollPane:與JPanel類似,但還可在大的組件或可擴(kuò)展組件周圍提供滾動(dòng)條。JTabbedPane:包含多個(gè)組件,但一次只顯示一個(gè)組件。用戶可在組件之間方便地切換。JToolBar:按行或列排列一組組件〔通常是按鈕〕。Swing容器組件主窗口Swing應(yīng)用程序創(chuàng)立容器設(shè)置容器大小〔對(duì)框架及面板而言〕設(shè)置容器可見度〔對(duì)框架及面板而言〕創(chuàng)立頂層容器頂層容器〔每個(gè)應(yīng)用程序中至少有一個(gè)〕內(nèi)容面板主要顯示區(qū)域包含

GUI中的可視組件

javax.swing包

常見容器JFrameJScrollPaneJPanel1.擴(kuò)展java.awt.Frame類2.用于在Swing程序中創(chuàng)立窗口3.包含邊框、標(biāo)題和用于關(guān)閉和圖標(biāo)化窗口的按鈕1.中間容器2.用于將較小的輕量級(jí)組件組合在一起3.與內(nèi)容窗格相似,面板在默認(rèn)情況下不透明管理視區(qū)、滾動(dòng)條及可選的行和列的標(biāo)題視區(qū)Swing容器JFrame是Application程序的圖形用戶界面容器。JFrame類常用的兩種構(gòu)造方法:〔1〕JFrame()構(gòu)造一個(gè)初始時(shí)不可見的新窗體?!?〕JFrame(Stringtitle)方法創(chuàng)立一個(gè)標(biāo)簽為title的JFrame對(duì)象創(chuàng)立窗體時(shí)有兩種方式:〔1〕直接編寫代碼調(diào)用JFrame類的構(gòu)造器。〔2〕繼承JFrame類,在繼承的類中編寫代碼對(duì)窗體進(jìn)行詳細(xì)地刻畫,這種方式比較適合窗體比較復(fù)雜的情況7.2.1頂層容器〔JFrame〕在參加控制組件之前首先要得到窗口的內(nèi)容窗格。要想將組件放入內(nèi)容窗格,可以使用兩種方法:〔1〕通過getContentPane()方法獲得其默認(rèn)的內(nèi)容窗格,返回類型為Container容器?!?〕通過創(chuàng)立一個(gè)新的內(nèi)容窗格取代頂層容器默認(rèn)的內(nèi)容窗格。通常的做法是創(chuàng)立一個(gè)JPanel的實(shí)例,將組件添加到JPanel實(shí)例中,setContentPane()方法將設(shè)置為新的內(nèi)容窗格。7.2.1頂層容器〔JFrame〕JFrame的常用方法設(shè)置框架的大小publicvoidsetSize(intwidth,intheight)設(shè)置框架是否可見publicvoidsetVisible(booleanb)設(shè)置布局方式publicvoidsetLayout(LayoutManagermgr)添加組件publicCompnentadd(Componentcomp)JFrame的setDefaultCloseOperation(intoperation)方法用來決定如何響應(yīng)用戶關(guān)閉窗體的操作,參數(shù)operation有以下可選值:JFrame.DO_NOTHING_ON_CLOSE:什么也不做。JFrame.HIDE_ON_CLOSE:隱藏窗體,這是JFrame的默認(rèn)選項(xiàng)。JFrame.EXIT_ON_CLOSE:結(jié)束程序。實(shí)例:MainFrame.java根本的Swing應(yīng)用程序importjavax.swing.*;

publicclassHelloSwing{publicstaticvoidmain(String[]args){JFrameframe=newJFrame("HelloSwing");JLabellabel=newJLabel("你好,Swing");frame.getContentPane().add(label);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(300,200);frame.setVisible(true);}}

導(dǎo)入必要的包,一般還需導(dǎo)入:

importjava.awt.*;importjava.awt.event.*;

設(shè)置一個(gè)頂級(jí)容器創(chuàng)立一個(gè)Swing組件將組件添加到容器內(nèi)容窗格實(shí)現(xiàn)了在單擊“關(guān)閉〞按鈕時(shí),可以關(guān)閉窗口。中間容器——面板類〔JPanel〕面板不是一個(gè)單獨(dú)的窗口,它只是包含在窗口中的一個(gè)區(qū)域,必須被添加到其他容器內(nèi)部。面板是可以將許多組件組合起來的一種容器。最簡(jiǎn)單的創(chuàng)立面板的方式就是通過面板的構(gòu)造函數(shù)JPanel()來進(jìn)行。面板也可以嵌套,由此可以設(shè)計(jì)出復(fù)雜的圖形用戶界面。JPanel類的常用構(gòu)造方法如下:①publicJPanel()使用默認(rèn)的FlowLayout方式創(chuàng)立具有雙緩沖的JPanel對(duì)象。②publicJPanel(FlowLayoutManagerlayout)在構(gòu)建對(duì)象時(shí)指定布局格式。中間容器——面板類〔JPanel〕JPanel的常用方法設(shè)置布局方式publicvoidsetLayout(LayoutManagermgr)設(shè)置面板的大小publicvoidsetSize(intwidth,intheight)設(shè)置背景顏色

publicvoidsetBackground(Colorcolor);添加組件PublicCompnentadd(Componentcomp)實(shí)例:MainFrame_Panel.java

滾動(dòng)窗口,可以把一個(gè)組件放到一個(gè)滾動(dòng)窗口中,然后通過滾動(dòng)條來觀察這各組件。與JPanel不同的是,它帶有滾動(dòng)條,且只能向滾動(dòng)窗口添加一個(gè)組件。中間容器—滾動(dòng)面板類〔JScrollPane〕中間容器—滾動(dòng)面板類(JScrollPane)JScrollPane類常用的構(gòu)造方法:①JScrollPane()創(chuàng)立一個(gè)空的JScrollPane②JScrollPane(Component

view)創(chuàng)立一個(gè)顯示指定組件內(nèi)容的JScrollPane,只要組件的內(nèi)容超過視圖大小就會(huì)顯示水平和垂直滾動(dòng)條。③JScrollPane(intvsbPolicy,inthsbPolicy)創(chuàng)立一個(gè)具有指定滾動(dòng)條策略的空〔無視口的視圖〕JScrollPane常用的成員方法:①publicvoidsetHorizontalScrollBarPolicy(intpolicy)

確定水平滾動(dòng)條何時(shí)顯示在滾動(dòng)窗格上選項(xiàng)有:ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED設(shè)置水平滾動(dòng)條只在需要時(shí)顯示,默認(rèn)策略ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER

水平滾動(dòng)條永遠(yuǎn)不顯示ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS水平滾動(dòng)條一直顯示②publicvoidsetVerticalScrollBarPolicy(intpolicy)確定垂直滾動(dòng)條何時(shí)顯示在滾動(dòng)窗格上。合法值是:ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED設(shè)置垂直滾動(dòng)條只在需要時(shí)顯示,默認(rèn)策略ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER垂直滾動(dòng)條永遠(yuǎn)不顯示ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS垂直滾動(dòng)條一直顯示③publicvoidsetViewportView(Componentview)創(chuàng)立一個(gè)視口并設(shè)置其視圖。例子:ScrollPanelDemo.java布局管理器用戶界面上的組件可以按不同方式排列。Java使用布局管理器來管理這些排列方式。每當(dāng)需要重新調(diào)整屏幕大小或重新繪制屏幕上任一工程時(shí),就要用到布局管理器。AWT提供一組用來進(jìn)行布局管理的類,稱為布局管理器或布局。所有布局都實(shí)現(xiàn)LayoutManager接口。布局管理器每個(gè)容器〔Container對(duì)象〕都有一個(gè)與它相關(guān)的缺省的布局管理器。-JFrame的缺省布局是BorderLayout在沒有設(shè)置新的布局前,在容器中添加組件都按照該容器的缺省布局排列??梢酝ㄟ^setLayout()方法為容器設(shè)置新的布局。布局管理器為了將組件排列在容器中適宜的位置上,java.awt包中共定義了五種布局編輯類,分別是FlowLayout,BorderLayout,CardLayout,GridLayout和GridBagLayout,這五個(gè)類都是類的直接子類。javax.swing包中定義了4種布局編輯類,分別是BoxLayout、ScrollPaneLayout、ViewportLayout和OverlayLayout。1.FlowLayout布局管理器FlowLayout的布局策略是將遵循這種布局策略的容器中的組件按照參加的先后順序從左向右排列,當(dāng)一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列.FlowLayout定義在java.awt包中.布局管理器FlowLayoutmylayout=newFlowLayout();FlowLayoutexLayout=newFlowLayout(FlowLayout.RIGHT);setLayout(exlayout);//為容器設(shè)置新布局

1.FlowLayout布局管理器容器流布局是面板的默認(rèn)布局管理器左上角右下角依次排序的組件垂直或水平間距布局管理器方法說明FlowLayout()構(gòu)造新的中間對(duì)齊的FlowLayout,將垂直和水平間距保留為5個(gè)像素FlowLayout(intalign)創(chuàng)建一個(gè)指定對(duì)齊方式的FlowLayout實(shí)例FlowLayout(intalign,inthgap,intvgap)創(chuàng)建一個(gè)既指定對(duì)齊方式,又指定組件間間隔的FlowLayout類的對(duì)象setAlignment(intalign)設(shè)置布局的對(duì)齊方式setHgap(inthgap)設(shè)置布局的水平間距setVgap(intvgap)設(shè)置布局的垂直間距

組件采用從左到右,從上到下逐行擺放。FlowLayoutOpenCloseokFlowLayoutOpenCloseok

setLayout(newFlowLayout(intalign,inthgap,intvgap))FlowLayout.LEFTFlowLayout.RIGHTFlowLayout.CENTER缺省是居中例子:FlowLayoutDemo.java2.BorderLayout布局管理器每個(gè)BorderLayout管理的容器被為東、西、南、北、中五個(gè)區(qū)域,這五個(gè)區(qū)域分別用字符串常量BorderLayout.EAST、BorderLayout.WEST、BorderLayout.SOUTH、BorderLayout.NORTH、BorderLayout.CENTER表示,每個(gè)區(qū)域,都可以參加一個(gè)組件,往容器內(nèi)參加組件時(shí)都應(yīng)該指明把它放在容器的哪個(gè)區(qū)域中布局管理器BorderLayout2-1上邊的組件

左邊的組件右邊的組件下邊的組件容器NorthSouthEastWestCENTER布局管理器方法說明BorderLayout()創(chuàng)建新的BorderLayout,組件之間沒有間距BorderLayout(inthorz,intvert)可以設(shè)定組件間的水平和垂直距離setHgap(inthgap)將組件間的水平間距設(shè)置為指定的值setVgap(intvgap)將組件間的垂直間距設(shè)置為指定的值例子:BorderLayoutDemo.java3.GridLayout布局管理器是一種網(wǎng)格式的布局管理器,它將容器空間劃分成假設(shè)干行乘假設(shè)干列的網(wǎng)格,而每個(gè)組件按添加的順序從左到右、從上到下占據(jù)這些網(wǎng)格,每個(gè)組件占據(jù)一格布局管理器行列組件大小相同重新調(diào)整組件大小以適合各自的單元指定網(wǎng)格中的行數(shù)和列數(shù),創(chuàng)立網(wǎng)格布局3GridLayout布局管理器GridLayout布局管理器方法描述GridLayout()創(chuàng)建網(wǎng)格布局,默認(rèn)為每個(gè)組件占用一整列和一單行GridLayout(introws,intcols)用指定的行數(shù)和列數(shù)創(chuàng)建網(wǎng)格布局。GridLayout(introws,intcols,inthgap,intvgap)用指定的行數(shù)和列數(shù)、指定的水平和垂直間距創(chuàng)建網(wǎng)格布局setColumns(intcols)將相應(yīng)布局中的列數(shù)設(shè)置為指定值setHgap(inthgap)將相應(yīng)布局中的水平間距設(shè)置為指定值setVgap(intvgap)將相應(yīng)布局中的垂直間距設(shè)置為指定值setRows(introws)將相應(yīng)布局中的行數(shù)設(shè)置為指定值GridLayout布局管理器...Buttonbtn[];//聲明按鈕數(shù)組Stringstr[]={"1","2","3","4","5","6","7","8","9"};setLayout(newGridLayout(3,3));btn=newButton[str.length];//創(chuàng)立按鈕數(shù)組for(inti=0;i<str.length;i++){btn[i]=newButton(str[i]);add(btn[i]);}例子:TestGridLayout.java4CardLayout布局管理器使用CardLayout的容器可以容納多個(gè)組件,但是實(shí)際上同一時(shí)刻容器只能從這些組件中選出一個(gè)來顯示,就像一疊“撲克牌〞每次只能顯示最上面一張一樣,這個(gè)被顯示的組件將占據(jù)所有的容器空間,依次排序。卡片通常為一個(gè)Panel對(duì)象。每當(dāng)需要許多面板切換,而每個(gè)面板需要顯示為不同布局時(shí),可以使用卡片布局。方法說明CardLayout()使用默認(rèn)(間隔為0)方式創(chuàng)建一個(gè)CardLayout()類對(duì)象CardLayout(inthgap,intvgap)后者使用hgap指定的水平間隔和vgap指定的垂直間隔創(chuàng)建一個(gè)CardLayout()類對(duì)象first(Containercontainer)顯示container中的第一個(gè)對(duì)象last(Containercontainer)顯示container中的最后一個(gè)對(duì)象next(Containercontainer)顯示下一個(gè)對(duì)象previous(Containercontainer)顯示上一個(gè)對(duì)象publicclassCardLayoutDemoextendsJFrame{publicCardLayoutDemo(){JButtonbt1=newJButton("按鈕A");JButtonbt2=newJButton("按鈕B");JButtonbt3=newJButton("按鈕C");CardLayoutcard=newCardLayout(20,20);Containercp=getContentPane();cp.setLayout(card);cp.add(bt1);cp.add(bt2);cp.add(bt3);card.next(cp);//顯示按鈕BsetSize(400,300);setVisible(true);}publicstaticvoidmain(String[]args){newCardLayoutDemo();}}實(shí)例:CardLayoutDemo.java4.BoxLayout布局管理器它將容器中的組件按水平方向排成一行或者垂直方向排成一列。當(dāng)組件排成一行時(shí),每個(gè)組件可以有不同的寬度,當(dāng)排成一列時(shí),每個(gè)組件可以有不同的高度。BoxLayout布局管理器構(gòu)造方法是:BoxLayout(Containertarget,intaxis)其中,target是容器對(duì)象,表示要為哪個(gè)容器設(shè)置此布局管理器;axis指明target中組件的排列方式布局管理器BoxLayout類常用的成員方法成員方法說明setLayoutAlignmentX(Containercon)設(shè)置Container中對(duì)象X軸方向的對(duì)齊方式setLayoutAlignmentY(Containercon)設(shè)置Container中對(duì)象Y軸方向的對(duì)齊方式LayoutContainer(Containertarget)設(shè)置target窗口容器的布局方式為BoxLayout例子:BoxLayoutDemo.javajavax.swing包中定義了一個(gè)專門使用BoxLayout布局管理器的特殊容器Box類Box的構(gòu)造函數(shù)為:Box(intaxis),axis表示水平排列的BoxLayout.X_AXIS或垂直排列的BoxLayout.Y_AXIS??墒褂肂ox類提供的創(chuàng)立Box實(shí)例的靜態(tài)方法創(chuàng)立:publicstaticBoxcreateHorizontalBox()publicstaticBoxcreateVerticalBox()布局管理器例子:BoxLayoutDemoBox.java使用BoxLayout時(shí)需要注意的事項(xiàng)(1)當(dāng)組件按BoxLayout布局排列好后,不管窗口縮小或放大都不會(huì)變動(dòng)。(2)當(dāng)使用水平排列方式時(shí),假設(shè)放進(jìn)去的組件不等高,那么系統(tǒng)將會(huì)使所有的組件與最高組件等高。(3)當(dāng)放在同一行的組件超出容器的寬度時(shí),系統(tǒng)不會(huì)自動(dòng)換行,需要用戶自行處理。如何選擇布局管理器要使組件盡量充滿容器空間BorderLayout要使組件以自然大小緊湊的在一行中顯示FlowLayout組件大小相同,并且成行或成列顯示GridLayout7.3事件處理GUI程序是由事件(event)驅(qū)動(dòng)的當(dāng)用戶與GUI交互可以產(chǎn)生事件(events)一些常見的交互方式移動(dòng)鼠標(biāo)、用鼠標(biāo)點(diǎn)擊按鈕、在文本框中輸入數(shù)據(jù)、關(guān)閉窗口等設(shè)計(jì)和實(shí)現(xiàn)圖形用戶界面的工作主要有兩個(gè):一是創(chuàng)立組成界面的各種成分和元素,構(gòu)成完整的圖形用戶界面的物理外觀;二是定義圖形用戶界面的事件和各界面元素對(duì)不同事件的響應(yīng),實(shí)現(xiàn)圖形用戶界面與用戶的交互功能。7.3事件處理Java最新的事件處理方法是基于委托事件模型,整個(gè)“委托事件模型〞由產(chǎn)生事件的對(duì)象(事件源)、事件對(duì)象及監(jiān)聽者對(duì)象之間的關(guān)系所組成。事件源生成事件并將其發(fā)送至一個(gè)或多個(gè)監(jiān)聽器。監(jiān)聽器簡(jiǎn)單地等待,直到它收到一個(gè)事件。一旦事件被接受,監(jiān)聽器將處理這些事件,然后返回。

源對(duì)象監(jiān)聽器事件

傳播事件的實(shí)例方法傳遞途徑代理事件模型Swing中的GUI組件適配器對(duì)象7.3.1事件處理模型7.3.1事件處理模型主要涉及三種對(duì)象和一個(gè)接口事件源(Aneventsource)事件對(duì)象(Aneventobject)事件監(jiān)聽器(eventlistener(s))處理事件的接口(eventinterface)事件監(jiān)聽器A事件監(jiān)聽器B事件對(duì)象事件對(duì)象事件源(例如:按鈕)事件源能夠產(chǎn)生事件的對(duì)象都可以成為事件源,如文本框、按鈕、下拉式列表等事件對(duì)象封裝了包含所發(fā)生的各種事件的有效信息信息包括:事件源的引用、以及事件監(jiān)聽器在處理事件時(shí)所需要的其它各種信息事件信息被包含在類AWTEvent或其子類的實(shí)例對(duì)象中7.3.1事件處理模型事件監(jiān)聽器接受事件對(duì)象,并處理事件對(duì)象,事件源通過調(diào)用相應(yīng)的方法將某個(gè)對(duì)象作為自己的監(jiān)視器。例如,對(duì)于文本框,這個(gè)方法是:addActionListener(監(jiān)視器);創(chuàng)立該監(jiān)視器對(duì)象的類必須聲明實(shí)現(xiàn)相應(yīng)的接口處理事件的接口接口中聲明的是事件對(duì)應(yīng)的處理方法,當(dāng)事件源發(fā)生事件時(shí),監(jiān)視器就自動(dòng)調(diào)用執(zhí)行被類實(shí)現(xiàn)的某個(gè)接口方法。7.3.1事件處理模型例題:TestEvent.java按鈕單擊事件例如publicclassMyEventTestextendsPanel{ButtonmyButton=newButton("藍(lán)色");...//創(chuàng)立面板或其他GUI組件MyListenermyAction=newMyListener();MyButton.addActionListener(myAction);

privateclassMyListenerimplementsActionListener{publicMyListener(){...//初始化}publicvoidactionPerformed(ActionEventevent){...//需要為事件進(jìn)行的操作}}}實(shí)現(xiàn)了ActionListener接口的監(jiān)聽器實(shí)現(xiàn)了actionPerformed方法,以便根據(jù)參數(shù)ActionEvent

對(duì)象的信息對(duì)事件做出響應(yīng)為按鈕事件注冊(cè)監(jiān)聽器對(duì)于某種類型的事件XXXEvent,必須定義相應(yīng)的事件監(jiān)聽器類,該類需要實(shí)現(xiàn)針對(duì)特定事件的特定接口XXXListener;例如:ActionEventActionListener事件源中,必須注冊(cè)該類事件的監(jiān)聽器,使用addXXXListener(XXXListener)來注冊(cè)監(jiān)聽器。

事件發(fā)生后,產(chǎn)生表示特定事件的事件對(duì)象,事件對(duì)象被傳遞給已經(jīng)注冊(cè)的事件監(jiān)聽器,調(diào)用監(jiān)聽器中的特定方法處理事件事件處理的一般方法:處理事件示意圖不同事件源上發(fā)生的事件種類不同,不同的事件有不同的監(jiān)聽者處理。所以在包和包中還定義了很多其他事件類。每個(gè)事件類都有一個(gè)對(duì)應(yīng)的接口,接口中聲明了假設(shè)干個(gè)抽象的事件處理方法,事件的監(jiān)聽程序類需要實(shí)現(xiàn)相應(yīng)的接口7.3.2事件及監(jiān)聽者7.3.2事件及監(jiān)聽者FocusEventAWTEventActionEventAdjustmentEventComponentEventTextEventItemEventContainerEventInputEventWindowEventPaintEventKeyEventMouseEventEventObject事件體系結(jié)構(gòu)1.AWT中的常用事件類及其監(jiān)聽者

和AWT有關(guān)的所有事件類都由類派生,它也是EventObject類的子類。AWT事件共有10類,可以歸為兩大類:低級(jí)事件高級(jí)事件1.AWT中的常用事件類及其監(jiān)聽者低級(jí)事件是指基于組件和容器的事件,如:鼠標(biāo)的進(jìn)入,點(diǎn)擊,拖放等。低級(jí)事件主要包括:ComponentEvent、ContainerEvent、WindowEvent、FocusEvent、KeyEvent、MouseEvent高級(jí)事件是基于語義的事件,它可以不和特定的動(dòng)作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,如在TextField中按Enter鍵會(huì)觸發(fā)ActionEvent事件。高級(jí)事件主要包括:ActionEvent、AdjustmentEvent、ItemEvent、TextEventAWT事件類型2-1事件類說明事件源ActionEvent通常按下按鈕,雙擊列表項(xiàng)或選中一個(gè)菜單項(xiàng)時(shí),就會(huì)生成此事件。Button、List、MenuItem、TextFieldAdjustmentEvent操縱滾動(dòng)條時(shí)會(huì)生成此事件。ScrollbarComponentEvent當(dāng)一個(gè)組件移動(dòng)、隱藏、調(diào)整大小或成為可見時(shí)會(huì)生成此事件。ComponentItemEvent單擊復(fù)選框或列表項(xiàng)時(shí),或者當(dāng)一個(gè)選擇框或一個(gè)可選菜單的項(xiàng)被選擇或取消時(shí)生成此事件。Checkbox、CheckboxMenuItem、Choice、ListFocusEvent組件獲得或失去鍵盤焦點(diǎn)時(shí)會(huì)生成此事件。ComponentAWT事件類型2-2事件類說明事件源KeyEvent接收到鍵盤輸入時(shí)會(huì)生成此事件。ComponentMouseEvent拖動(dòng)、移動(dòng)、單擊、按下或釋放鼠標(biāo)或在鼠標(biāo)進(jìn)入或退出一個(gè)組件時(shí),會(huì)生成此事件。ComponentContainerEvent將組件添加至容器或從中刪除時(shí)會(huì)生成此事件。ContainerTextEvent在文本區(qū)或文本域的文本改變時(shí)會(huì)生成此事件。TextField、TextAreaWindowEvent當(dāng)一個(gè)窗口激活、關(guān)閉、失效、恢復(fù)、最小化、打開或退出時(shí)會(huì)生成此事件。

Window監(jiān)聽器接口監(jiān)聽器通過實(shí)現(xiàn)java.awt.event包中定義的一個(gè)或多個(gè)接口來創(chuàng)立。在發(fā)生事件時(shí),事件源將調(diào)用監(jiān)聽器定義的相應(yīng)方法。有興趣接收事件的任何監(jiān)聽器類都必須實(shí)現(xiàn)監(jiān)聽器接口。監(jiān)聽器接口列表2-1事件監(jiān)聽器

方法

ActionListener

actionPerformed

AdjustmentListener

adjustmentValueChanged

ComponentListener

componentResizedcomponentMovedcomponentShowncomponentHidden

ContainerListener

componentAddedcomponentRemoved

FocusListener

focusLost、focusGained

ItemListener

itemStateChanged

監(jiān)聽器接口列表2-2事件監(jiān)聽器

方法

KeyListener

keyPressed、keyReleasedkeyTyped

MouseListener

mouseClicked、mouseEnteredmouseExited、mousePressedmouseReleased

MouseMotionListener

mouseDragged、mouseMoved

TextListener

textValueChanged

WindowListener

windowActivated、windowDeactivatedwindowClosed、windowClosingwindowIconified、windowDeiconifiedwindowOpened

2.Swing中的常用事件類及其監(jiān)聽者使用Swing組件時(shí),對(duì)于比較低層的事件需要使用AWT包提供的處理方法對(duì)事件進(jìn)行處理。在包中也定義了一些事件類表7.2列出了常用的Swing事件及其相應(yīng)的監(jiān)聽器接口。事件類別描述信息接口名方法AncestorEvent報(bào)告給子組件AncestorListenerancestorAdded(AncestorEventevent)ancestorRemoved(AncestorEventevent)ancestorMoved(AncestorEventevent)CaretEvent文本插入符已發(fā)生更改CaretListenercaretUpdate(CaretEvente)ChangeEvent事件源的狀態(tài)發(fā)生更改ChangeListenerstateChanged(ChangeEvente)DocumentEvent文檔更改DocumentListenerinsertUpdate(DocumentEvent

e)removeUpdate(DocumentEvent

e)changedUpdate(DocumentEvente)UndoableEditEvent撤消操作UndoableEditListenerundoableEditHappened(UndoableEditEvente)ListSelectionEvent選擇值發(fā)生更改ListSelectionListenervalueChanged(ListSelectionEvente)ListDataEvent列表內(nèi)容更改ListDataListenerintervalAdded(ListDataEvente)contentsChanged(ListDataEvente)intervalRemoved(ListDataEvente)TableModelEvent表模型發(fā)生更改TableModelListenertableChanged(TableModelEvente)MenuEvent菜單事件MenuListenermenuSelected(MenuEvente)menuDeselected(MenuEvente)menuCanceled(MenuEvente)TreeExpansionEvent樹擴(kuò)展或折疊某一節(jié)點(diǎn)TreeExpansionListenertreeExpanded(TreeExpansionEventevent)treeCollapsed(TreeExpansionEventevent)TreeModelEvent樹模型更改TreeModelListenertreeNodesChanged(TreeModelEvente)treeNodesInserted(TreeModelEvente)treeNodesRemoved(TreeModelEvente)treeStructureChanged(TreeModelEvente)TreeSelectionEvent樹模型選擇發(fā)生更改TreeSelectionListenervalueChanged(TreeSelectionEvente)窗口事件當(dāng)一個(gè)窗口被激活、禁止、關(guān)閉、正在關(guān)閉、最小化、恢復(fù)、翻開時(shí)將生成窗口事件WindowEvent。WindowEvent類的主要方法有g(shù)etSource()。在EventObject類中定義了getSource()方法,該方法是從事件對(duì)象中獲取觸發(fā)事件的事件源,其返回值的類型為Object,需要自己編寫代碼進(jìn)行對(duì)象的強(qiáng)制類型轉(zhuǎn)化。事件WindowEvent

對(duì)應(yīng)的監(jiān)聽器接口是WindowListener

需要實(shí)現(xiàn)的方法如下:windowActivated、windowClosedwindowClosing、windowDeactivatedwindowDeiconified、windowIconifiedwindowOpened例子:WindowEventDemo.java事件適配器為了使事件處理變得簡(jiǎn)單,Java為具有多個(gè)方法的監(jiān)聽器接口提供適配器類。適配器類實(shí)現(xiàn)并提供了一個(gè)事件監(jiān)聽器接口中的所有的方法,但這些方法都是空方法。例如WindowAdapter類實(shí)現(xiàn)了WindowListener接口。因此,可以使用WindowAdapte的子類創(chuàng)立的對(duì)象做監(jiān)視器,在子類中重寫所需要的接口方法即可窗口事件適配器例如classMyFrameextendsFrame{

booleanw;

publicMyFrame(){

w=false;

setTitle("測(cè)試適配器類");

setSize(300,200);

addWindowListener(newMyWindowAdapter());}

privateclassMyWindowAdapterextendsWindowAdapter{

publicvoidwindowClosing(WindowEventwevent){if(w)dispose();}}}實(shí)現(xiàn)了windowClosing方法,以響應(yīng)窗口關(guān)閉時(shí)的事件

importjava.awt.*;

importjava.awt.event.*;

publicclassMyAdapterDemo{publicstaticvoidmain(String[]args){MyFramefrm=newMyFrame();frm.setVisible(true);}}事件接口與適配器類ListenerInterfaceAdapterClassActionListener

無AdjustmentListener

無ComponentListenerComponentAdapter

ContainerListener

ContainerAdapterFocusListener

FocusAdapter

ItemListener

無事件接口與適配器類ListenerInterfaceAdapterClassKeyListener

KeyAdapterMouseListener

MouseAdapter

MouseMotionListenerMouseMotionAdapterTextListener

無WindowListener

WindowAdapter當(dāng)按下、釋放或敲擊鍵盤上一個(gè)鍵時(shí),就發(fā)生了鍵盤事件keyEvent。事件源使用addKeyListener方法注冊(cè)監(jiān)視器。生成keyEvent時(shí)將調(diào)用KeyListener接口對(duì)象。鍵盤事件在KeyListener這個(gè)接口中有如下三個(gè)事件:publicvoidkeyPressed(KeyEvente);“按

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論