




已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
5.2.1 事件類 與AWT有關(guān)的所有事件類都由java.awt.AWTEvent類派生,它也是EventObject類的子類。AWT事件共有10類,可以歸為兩大類:低級(jí)事件和高級(jí)事件。 java.util.EventObject類是所有事件對(duì)象的基礎(chǔ)父類,所有事件都是由它派生出來的。AWT的相關(guān)事件繼承于java.awt.AWTEvent類,這些AWT事件分為兩大類:低級(jí)事件和高級(jí)事件,低級(jí)事件是指基于組件和容器的事件,當(dāng)一個(gè)組件上發(fā)生事件,如:鼠標(biāo)的進(jìn)入,點(diǎn)擊,拖放等,或組件的窗口開關(guān)等,觸發(fā)了組件事件。高級(jí)事件是基于語義的事件,它可以不和特定的動(dòng)作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類,如在TextField中按Enter鍵會(huì)觸發(fā)ActionEvent事件,滑動(dòng)滾動(dòng)條會(huì)觸發(fā)AdjustmentEvent事件,或是選中項(xiàng)目列表的某一條就會(huì)觸發(fā)ItemEvent事件。 低級(jí)事件 ComponentEvent( 組件事件:組件尺寸的變化,移動(dòng)) ContainerEvent( 容器事件:組件增加,移動(dòng)) WindowEvent( 窗口事件:關(guān)閉窗口,窗口閉合,圖標(biāo)化) FocusEvent( 焦點(diǎn)事件:焦點(diǎn)的獲得和丟失) KeyEvent( 鍵盤事件:鍵按下、釋放) MouseEvent( 鼠標(biāo)事件:鼠標(biāo)單擊,移動(dòng)) 高級(jí)事件(語義事件) ActionEvent(動(dòng)作事件:按鈕按下,TextField中按Enter鍵) AdjustmentEvent(調(diào)節(jié)事件:在滾動(dòng)條上移動(dòng)滑塊以調(diào)節(jié)數(shù)值) ItemEvent(項(xiàng)目事件:選擇項(xiàng)目,不選擇項(xiàng)目改變) TextEvent(文本事件,文本對(duì)象改變) 5.2.2 事件監(jiān)聽器 每類事件都有對(duì)應(yīng)的事件監(jiān)聽器,監(jiān)聽器是接口,根據(jù)動(dòng)作來定義方法。 例如,與鍵盤事件KeyEvent相對(duì)應(yīng)的接口是: public interface KeyListener extends EventListener public void keyPressed(KeyEvent ev); public void keyReleased(KeyEvent ev); public void keyTyped(KeyEvent ev); 注意到在本接口中有三個(gè)方法,那么java運(yùn)行時(shí)系統(tǒng)何時(shí)調(diào)用哪個(gè)方法?其實(shí)根據(jù)這三個(gè)方法的方法名就能夠知道應(yīng)該是什么時(shí)候調(diào)用哪個(gè)方法執(zhí)行了。當(dāng)鍵盤剛按下去時(shí),將調(diào)用keyPressed( )方法執(zhí)行,當(dāng)鍵盤抬起來時(shí),將調(diào)用keyReleased( )方法執(zhí)行,當(dāng)鍵盤敲擊一次時(shí),將調(diào)用keyTyped( )方法執(zhí)行。 又例如窗口事件接口: public interface WindowListener extends EventListener public void windowClosing(WindowEvent e); /把退出窗口的語句寫在本方法中 public void windowOpened(WindowEvent e); /窗口打開時(shí)調(diào)用 public void windowIconified(WindowEvent e); /窗口圖標(biāo)化時(shí)調(diào)用 public void windowDeiconified(WindowEvent e); /窗口非圖標(biāo)化時(shí)調(diào)用 public void windowClosed(WindowEvent e); /窗口關(guān)閉時(shí)調(diào)用 public void windowActivated(WindowEvent e); /窗口激活時(shí)調(diào)用 public void windowDeactivated(WindowEvent e); /窗口非激活時(shí)調(diào)用 AWT的組件類中提供注冊(cè)和注銷監(jiān)聽器的方法: 注冊(cè)監(jiān)聽器: public void add (listener); 注銷監(jiān)聽器: public void remove (listener); 例如Button類:(查API) public class Button extends Component public synchronized void addActionListener(ActionListener l); public synchronized void removeActionListener(ActionListener l); 5.2.3 AWT事件及其相應(yīng)的監(jiān)聽器接口(1) 5.2.3 AWT事件及其相應(yīng)的監(jiān)聽器接口(2) 例5.10說明事件處理模型的應(yīng)用。 例5.10 import java.awt.*; import java.awt.event.*; public class ThreeListener implements MouseMotionListener,MouseListener,WindowListener /實(shí)現(xiàn)了三個(gè)接口 private Frame f; private TextField tf; public static void main(String args) ThreeListener two = new ThreeListener(); two.go(); public void go() f = new Frame(Three listeners example); f.add(new Label(Click and drag the mouse),North); tf = new TextField(30); f.add(tf,South); /使用缺省的布局管理器 f.addMouseMotionListener(this); /注冊(cè)監(jiān)聽器MouseMotionListener f.addMouseListener(this); /注冊(cè)監(jiān)聽器MouseListener f.addWindowListener(this); /注冊(cè)監(jiān)聽器WindowListener f.setSize(300,200); f.setVisible(true); public void mouseDragged (MouseEvent e) /實(shí)現(xiàn)mouseDragged方法 String s = Mouse dragging : X=+e.getX()+Y = +e.getY(); tf.setText(s); public void mouseMoved(MouseEvent e) /對(duì)其不感興趣的方法可以方法體為空 public void mouseClicked(MouseEvent e) public void mouseEntered(MouseEvent e) String s = The mouse entered; tf.setText(s); public void mouseExited(MouseEvent e) String s = The mouse has left the building; tf.setText(s); public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void windowClosing(WindowEvent e) /為了使窗口能正常關(guān)閉,程序正常退出,需要實(shí)現(xiàn)windowClosing方法 System.exit(1); public void windowOpened(WindowEvent e) /對(duì)其不感興趣的方法可以方法體為空 public void windowIconified(WindowEvent e) public void windowDeiconified(WindowEvent e) public void windowClosed(WindowEvent e) public void windowActivated(WindowEvent e) public void windowDeactivated(WindowEvent e) 上例中有如下幾個(gè)特點(diǎn): 1可以聲明多個(gè)接口,接口之間用逗號(hào)隔開。 implements MouseMotionListener, MouseListener, WindowListener; 2可以由同一個(gè)對(duì)象監(jiān)聽一個(gè)事件源上發(fā)生的多種事件: f.addMouseMotionListener(this); f.addMouseListener(this); f.addWindowListener(this); 則對(duì)象f 上發(fā)生的多個(gè)事件都將被同一個(gè)監(jiān)聽器接收和處理。 3事件處理者和事件源處在同一個(gè)類中。本例中事件源是Frame f,事件處理者是類ThreeListener,其中事件源Frame f是類ThreeListener的成員變量。 4可以通過事件對(duì)象獲得詳細(xì)資料,比如本例中就通過事件對(duì)象獲得了鼠標(biāo)發(fā)生時(shí)的坐標(biāo)值。 public void mouseDragged(MouseEvent e) String s=Mouse dragging :X=+e.getX()+Y=+e.getY(); tf.setText(s); Java語言類的層次非常分明,因而只支持單繼承,為了實(shí)現(xiàn)多重繼承的能力,Java用接口來實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,這種機(jī)制比多重繼承具有更簡(jiǎn)單、靈活、更強(qiáng)的功能。在AWT中就經(jīng)常用到聲明和實(shí)現(xiàn)多個(gè)接口。記住無論實(shí)現(xiàn)了幾個(gè)接口,接口中已定義的方法必須一一實(shí)現(xiàn),如果對(duì)某事件不感興趣,可以不具體實(shí)現(xiàn)其方法,而用空的方法體來代替。但卻必須所有方法都要寫上。 5.2.4 事件適配器 Java語言為一些Listener接口提供了適配器(Adapter)類??梢酝ㄟ^繼承事件所對(duì)應(yīng)的Adapter類,重寫需要方法,無關(guān)方法不用實(shí)現(xiàn)。事件適配器為我們提供了一種簡(jiǎn)單的實(shí)現(xiàn)監(jiān)聽器的手段, 可以縮短程序代碼。但是,由于java的單一繼承機(jī)制,當(dāng)需要多種監(jiān)聽器或此類已有父類時(shí),就無法采用事件適配器了。 1事件適配器-EventAdapter 下例中采用了鼠標(biāo)適配器: import java.awt.*; import java.awt.event.*; public class MouseClickHandler extends MouseAdaper public void mouseClicked(MouseEvent e) /只實(shí)現(xiàn)需要的方法 java.awt.event包中定義的事件適配器類包括以下幾個(gè): 1ComponentAdapter( 組件適配器) 2ContainerAdapter( 容器適配器) 3FocusAdapter( 焦點(diǎn)適配器) 4KeyAdapter( 鍵盤適配器) 5MouseAdapter( 鼠標(biāo)適配器) 6MouseMotionAdapter( 鼠標(biāo)運(yùn)動(dòng)適配器) 7WindowAdapter( 窗口適配器) 2. 用內(nèi)部類實(shí)現(xiàn)事件處理 內(nèi)部類(inner class)是被定義于另一個(gè)類中的類,使用內(nèi)部類的主要原因是由于: 一個(gè)內(nèi)部類的對(duì)象可訪問外部類的成員方法和變量,包括私有的成員。 實(shí)現(xiàn)事件監(jiān)聽器時(shí),采用內(nèi)部類、匿名類編程非常容易實(shí)現(xiàn)其功能。 編寫事件驅(qū)動(dòng)程序,內(nèi)部類很方便。 因此內(nèi)部類所能夠應(yīng)用的地方往往是在AWT的事件處理機(jī)制中。 例5.11 import java.awt.* ; import java.awt.event.*; public class InnerClass private Frame f; private TextField tf; public InnerClass() f=new Frame(Inner classes example); tf=new TextField(30); public voidi launchFrame() Label label=new Label(Click and drag the mouse); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(new MyMouseMotionListener();/*參數(shù)為內(nèi)部類對(duì)象*/ f.setSize(300,200); f.setVisible(true); class MyMouseMotionListener extends MouseMotionAdapter /*內(nèi)部類開始*/ public void mouseDragged(MouseEvent e) String s=Mouse dragging: x=+e.getX()+Y=+e.getY(); tf.setText(s); ; public static void main(String args) InnerClass obj=new InnerClass(); obj.launchFrame(); /內(nèi)部類結(jié)束 3匿名類(Anonymous Class) 當(dāng)一個(gè)內(nèi)部類的類聲名只是在創(chuàng)建此類對(duì)象時(shí)用了一次,而且要產(chǎn)生的新類需繼承于一個(gè)已有的父類或?qū)崿F(xiàn)一個(gè)接口,才能考慮用匿名類,由于匿名類本身無名,因此它也就不存在構(gòu)造方法,它需要顯示地調(diào)用一個(gè)無參的父類的構(gòu)造方法,并且重寫父類的方法。所謂的匿名就是該類連名字都沒有,只是顯示地調(diào)用一個(gè)無參的父類的構(gòu)造方法。 例5.12 import java.awt.* ; import java.awt.event.*; public class AnonymousClass private Frame f; private TextField tf; public AnonymousClass() f=new Frame(Inner classes example); tf=new TextField(30); public void launchFrame() Label label=new Label(Click and drag the mouse); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(new MouseMotionAdapter() /匿名類開始 public void mouseDragged(MouseEvent e) String s=Mouse dragging: x=+e.getX()+Y=+e.getY(); tf.setText(s); ); /匿名類結(jié)束 f.setSize(300,200); f.setVisible(true); public static void main(String args) AnonymousClass obj=new AnonymousClass(); obj.launchFrame(); 其實(shí)大家仔細(xì)分析一下,例5.11和5.12實(shí)現(xiàn)的都是完全一樣的功能,只不過采取的方式不同。5.11中的事件處理類是一個(gè)內(nèi)部類,而5.12的事件處理類是匿名類,可以說從類的關(guān)系來說是越來越不清楚,但是程序也越來越簡(jiǎn)練。熟悉這兩種方式也十分有助于大家編寫圖形界面的程序。 5.3 AWT組件庫(kù)(1) 本節(jié)從應(yīng)用的角度進(jìn)一步介紹AWT的一些組件,目的使大家加深對(duì)AWT的理解,掌握如何用各種組件構(gòu)造圖形化用戶界面,學(xué)會(huì)控制組件的顏色和字體。下面是一些常用的組件的介紹: 1 按鈕(Button) 按鈕是最常用的一個(gè)組件,其構(gòu)造方法是:Button b = new Button(Quit); 當(dāng)按鈕被點(diǎn)擊后,會(huì)產(chǎn)生ActionEvent事件,需ActionListener接口進(jìn)行監(jiān)聽和處理事件。 ActionEvent的對(duì)象調(diào)用getActionCommand()方法可以得到按鈕的標(biāo)識(shí)名,缺省按鈕名為label。 用setActionCommand()可以為按鈕設(shè)置組件標(biāo)識(shí)符。 2.復(fù)選框 (Checkbox) 復(fù)選框提供簡(jiǎn)單的on/off開關(guān),旁邊顯示文本標(biāo)簽。 構(gòu)造方法如下: setLayout(new GridLayout(3,1); add(new Checkbox(one,null,true); add(new Checkbox(two); add(new Checkbox(three); 復(fù)選框用ItemListener 來監(jiān)聽I(yíng)temEvent事件,當(dāng)復(fù)選框狀態(tài)改變時(shí)用getStateChange()獲取當(dāng)前狀態(tài)。使用getItem()獲得被修改復(fù)選框的字符串對(duì)象。 例5.13 class Handler implements ItemListener public void itemStateChanged(ItemEvent ev) String state = deselected; if (ev.getStateChange() = = ItemEvent.SELECTED) state = selected System.out.println(ev.getItem()+ +state); 3.復(fù)選框組(CheckboxGroup) 使用復(fù)選框組,可以實(shí)現(xiàn)單選框的功能。方法如下: setLayout(new GridLayout(3, 1); CheckboxGroup cbg = new CheckboxGroup(); add(new Checkbox(one, cbg, true); add(new Checkbox(two, cbg, false); add(new Checkbox(three, cbg, false); 5.3 AWT組件庫(kù)(2) 4. 下拉式菜單(Choice) 下拉式菜單每次只能選擇其中的一項(xiàng),它能夠節(jié)省顯示空間,適用于大量選項(xiàng)。 Choice Colorchooser=new Choice(); Colorchooser.add(Green); Colorchooser.add(Red); Colorchooser.add(Blue); Choice 用ItemListener接口來進(jìn)行監(jiān)聽 5. Canvas 一個(gè)應(yīng)用程序必須繼承Canvas類才能獲得有用的功能,比如創(chuàng)建一個(gè)自定義組件。如果想在畫布上完成一些圖形處理,則Canvas類中的paint()方法必須被重寫。 Canvas組件監(jiān)聽各種鼠標(biāo),鍵盤事件。當(dāng)在Canvas組件中輸入字符時(shí),必須先調(diào)用requestFocus()方法。 例5.14 import java.awt.*; import java.awt.event.*; import java.util.*; public class MyCanvas implements KeyListener, MouseListener Canvas c; /聲明一個(gè)畫布對(duì)象 String s=; public static void main(String args) Frame f=new Frame(Canvas); MyCanvas mc=new MyCanvas(); mc.c=new Canvas(); f.add(Center,mc.c); f.setSize(150,150); mc.c.addMouseListener(mc); /注冊(cè)監(jiān)聽器 mc.c.addKeyListener(mc); /注冊(cè)監(jiān)聽器 f.setVisible(true); public void mouseClicked(MouseEvent ev) System.out.println(MouseClicked); c.requestFocus();/獲得焦點(diǎn),表示該窗口將接收用戶的鍵盤和鼠標(biāo)輸入 public void keyTyped(KeyEvent ev) System.out.println(KeyTyped); s+=ev.getKeyChar(); /獲取每個(gè)輸入的字符,依次添加到字符串s中 c.getGraphics().drawString(s,0,20); /顯示字符串s public void keyPressed(KeyEvent ev) System.out.println(KeyPressed); public void keyReleased(KeyEvent ev) System.out.println(KeyReleased); public void mousePressed(MouseEvent ev) System.out.println(MousePressed); public void mouseReleased(MouseEvent ev) System.out.println(MouseReleased); public void mouseEntered(MouseEvent ev) System.out.println(MouseEntered); public void mouseExited(MouseEvent ev) System.out.println(MouseExited); 6. 單行文本輸入?yún)^(qū)(TextField) 只能顯示一行,當(dāng)回車鍵被按下時(shí),會(huì)發(fā)生ActionEvent事件,可以通過ActionListener中的actionPerformed()方法對(duì)事件進(jìn)行相應(yīng)處理??梢允褂胹etEditable(boolean)方法設(shè)置為只讀屬性。 單行文本輸入?yún)^(qū)構(gòu)造方法如下: TextField tf1,tf2,tf3,tf4: tf1=new TextField(); tf2=new TextField(,20); /顯示區(qū)域?yàn)?0列 tf3=new TextField(Hello!); /按文本區(qū)域大小顯示 tf4=new TextField(Hello!,30); /初始文本為Hello!, 顯示區(qū)域?yàn)?0列 5.3 AWT組件庫(kù)(3) 7. 文本輸入?yún)^(qū)(TextArea) TextArea可以顯示多行多列的文本。使用setEditable(boolean)方法,可以將其設(shè)置為只讀的。在TextArea中可以顯示水平或垂直的滾動(dòng)條。 要判斷文本是否輸入完畢,可以在TextArea旁邊設(shè)置一個(gè)按鈕,通過按鈕點(diǎn)擊產(chǎn)生的ActionEvent對(duì)輸入的文本進(jìn)行處理。 8. 列表(List) 列表中提供了多個(gè)文本選項(xiàng),列表支持滾動(dòng)條,可以瀏覽多項(xiàng) List lst=new List(4,false); /兩個(gè)參數(shù)分別表示顯示的行數(shù)、是否允許多選 lst.add(Venus); lst.add(Earth); lst.add(JavaSoft); lst.add(Mars); cnt.add(lst); 9. 框架(Frame) Frame是頂級(jí)窗口,可以顯示標(biāo)題,重置大小。當(dāng)Frame被關(guān)閉,將產(chǎn)生WindowEvent事件,F(xiàn)rame無法直接監(jiān)聽鍵盤輸入事件。 10. 對(duì)話框(Dialog) 它是Window類的子類。對(duì)話框和一般
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 往年藥師試題及答案
- 2025年商務(wù)公司股權(quán)變更協(xié)議
- 2025年商場(chǎng)內(nèi)部裝修工程安全管理協(xié)議
- 2025年飯莊股東權(quán)益保護(hù)協(xié)議
- 2025年倉(cāng)儲(chǔ)設(shè)施租賃協(xié)議策劃終止標(biāo)準(zhǔn)
- 2025年勞務(wù)合作策劃管理協(xié)議
- 統(tǒng)籌推進(jìn)教師教育能力提升的現(xiàn)狀及總體形勢(shì)
- 儲(chǔ)備物資的高效配送與倉(cāng)儲(chǔ)創(chuàng)新
- 文化創(chuàng)新與社會(huì)需求的契合路徑
- 高升專數(shù)學(xué)(文)一元一次方程應(yīng)用題模擬試卷(2025年)
- 2025年中國(guó)振弦式應(yīng)變計(jì)市場(chǎng)調(diào)查研究報(bào)告
- 上海市閔行區(qū)六校聯(lián)考2023-2024學(xué)年高一下學(xué)期期末考試數(shù)學(xué)試題(解析版)
- GB/T 6516-2025電解鎳
- 職業(yè)技術(shù)學(xué)院2024級(jí)工業(yè)互聯(lián)網(wǎng)技術(shù)專業(yè)人才培養(yǎng)方案
- 2025年全國(guó)低壓電工證(復(fù)審)考試筆試試題(300題)含答案
- 羅森加盟合同協(xié)議
- 榆林市煤炭資源整合實(shí)施方案
- 跨學(xué)科實(shí)踐活動(dòng)05 基于碳中和理念設(shè)計(jì)低碳行動(dòng)方案(活動(dòng)設(shè)計(jì))-2024-2025學(xué)年九年級(jí)化學(xué)跨學(xué)科實(shí)踐活動(dòng)教學(xué)教學(xué)設(shè)計(jì)+設(shè)計(jì)(人教版2024)
- 2025年中考英語押題預(yù)測(cè)卷(徐州專用)(原卷版)
- 前程無憂測(cè)評(píng)題庫(kù)
- 2025-2030中國(guó)馬丁靴行業(yè)發(fā)展分析及發(fā)展前景與投資研究報(bào)告
評(píng)論
0/150
提交評(píng)論