java AWT教程.docx_第1頁(yè)
java AWT教程.docx_第2頁(yè)
java AWT教程.docx_第3頁(yè)
java AWT教程.docx_第4頁(yè)
java AWT教程.docx_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

5.2.1 事件類(lèi) 與AWT有關(guān)的所有事件類(lèi)都由java.awt.AWTEvent類(lèi)派生,它也是EventObject類(lèi)的子類(lèi)。AWT事件共有10類(lèi),可以歸為兩大類(lèi):低級(jí)事件和高級(jí)事件。 java.util.EventObject類(lèi)是所有事件對(duì)象的基礎(chǔ)父類(lèi),所有事件都是由它派生出來(lái)的。AWT的相關(guān)事件繼承于java.awt.AWTEvent類(lèi),這些AWT事件分為兩大類(lèi):低級(jí)事件和高級(jí)事件,低級(jí)事件是指基于組件和容器的事件,當(dāng)一個(gè)組件上發(fā)生事件,如:鼠標(biāo)的進(jìn)入,點(diǎn)擊,拖放等,或組件的窗口開(kāi)關(guān)等,觸發(fā)了組件事件。高級(jí)事件是基于語(yǔ)義的事件,它可以不和特定的動(dòng)作相關(guān)聯(lián),而依賴(lài)于觸發(fā)此事件的類(lèi),如在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( 鍵盤(pán)事件:鍵按下、釋放) MouseEvent( 鼠標(biāo)事件:鼠標(biāo)單擊,移動(dòng)) 高級(jí)事件(語(yǔ)義事件) 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)聽(tīng)器 每類(lèi)事件都有對(duì)應(yīng)的事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)器是接口,根據(jù)動(dòng)作來(lái)定義方法。 例如,與鍵盤(pán)事件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)鍵盤(pán)剛按下去時(shí),將調(diào)用keyPressed( )方法執(zhí)行,當(dāng)鍵盤(pán)抬起來(lái)時(shí),將調(diào)用keyReleased( )方法執(zhí)行,當(dāng)鍵盤(pán)敲擊一次時(shí),將調(diào)用keyTyped( )方法執(zhí)行。 又例如窗口事件接口: public interface WindowListener extends EventListener public void windowClosing(WindowEvent e); /把退出窗口的語(yǔ)句寫(xiě)在本方法中 public void windowOpened(WindowEvent e); /窗口打開(kāi)時(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的組件類(lèi)中提供注冊(cè)和注銷(xiāo)監(jiān)聽(tīng)器的方法: 注冊(cè)監(jiān)聽(tīng)器: public void add (listener); 注銷(xiāo)監(jiān)聽(tīng)器: public void remove (listener); 例如Button類(lèi):(查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)聽(tīng)器接口(1) 5.2.3 AWT事件及其相應(yīng)的監(jiān)聽(tīng)器接口(2) 例5.10說(shuō)明事件處理模型的應(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)聽(tīng)器MouseMotionListener f.addMouseListener(this); /注冊(cè)監(jiān)聽(tīng)器MouseListener f.addWindowListener(this); /注冊(cè)監(jiān)聽(tīng)器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)隔開(kāi)。 implements MouseMotionListener, MouseListener, WindowListener; 2可以由同一個(gè)對(duì)象監(jiān)聽(tīng)一個(gè)事件源上發(fā)生的多種事件: f.addMouseMotionListener(this); f.addMouseListener(this); f.addWindowListener(this); 則對(duì)象f 上發(fā)生的多個(gè)事件都將被同一個(gè)監(jiān)聽(tīng)器接收和處理。 3事件處理者和事件源處在同一個(gè)類(lèi)中。本例中事件源是Frame f,事件處理者是類(lèi)ThreeListener,其中事件源Frame f是類(lèi)ThreeListener的成員變量。 4可以通過(guò)事件對(duì)象獲得詳細(xì)資料,比如本例中就通過(guò)事件對(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語(yǔ)言類(lèi)的層次非常分明,因而只支持單繼承,為了實(shí)現(xiàn)多重繼承的能力,Java用接口來(lái)實(shí)現(xiàn),一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,這種機(jī)制比多重繼承具有更簡(jiǎn)單、靈活、更強(qiáng)的功能。在AWT中就經(jīng)常用到聲明和實(shí)現(xiàn)多個(gè)接口。記住無(wú)論實(shí)現(xiàn)了幾個(gè)接口,接口中已定義的方法必須一一實(shí)現(xiàn),如果對(duì)某事件不感興趣,可以不具體實(shí)現(xiàn)其方法,而用空的方法體來(lái)代替。但卻必須所有方法都要寫(xiě)上。 5.2.4 事件適配器 Java語(yǔ)言為一些Listener接口提供了適配器(Adapter)類(lèi)??梢酝ㄟ^(guò)繼承事件所對(duì)應(yīng)的Adapter類(lèi),重寫(xiě)需要方法,無(wú)關(guān)方法不用實(shí)現(xiàn)。事件適配器為我們提供了一種簡(jiǎn)單的實(shí)現(xiàn)監(jiān)聽(tīng)器的手段, 可以縮短程序代碼。但是,由于java的單一繼承機(jī)制,當(dāng)需要多種監(jiān)聽(tīng)器或此類(lèi)已有父類(lèi)時(shí),就無(wú)法采用事件適配器了。 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包中定義的事件適配器類(lèi)包括以下幾個(gè): 1ComponentAdapter( 組件適配器) 2ContainerAdapter( 容器適配器) 3FocusAdapter( 焦點(diǎn)適配器) 4KeyAdapter( 鍵盤(pán)適配器) 5MouseAdapter( 鼠標(biāo)適配器) 6MouseMotionAdapter( 鼠標(biāo)運(yùn)動(dòng)適配器) 7WindowAdapter( 窗口適配器) 2. 用內(nèi)部類(lèi)實(shí)現(xiàn)事件處理 內(nèi)部類(lèi)(inner class)是被定義于另一個(gè)類(lèi)中的類(lèi),使用內(nèi)部類(lèi)的主要原因是由于: 一個(gè)內(nèi)部類(lèi)的對(duì)象可訪問(wèn)外部類(lèi)的成員方法和變量,包括私有的成員。 實(shí)現(xiàn)事件監(jiān)聽(tīng)器時(shí),采用內(nèi)部類(lèi)、匿名類(lèi)編程非常容易實(shí)現(xiàn)其功能。 編寫(xiě)事件驅(qū)動(dòng)程序,內(nèi)部類(lèi)很方便。 因此內(nèi)部類(lè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)部類(lèi)對(duì)象*/ f.setSize(300,200); f.setVisible(true); class MyMouseMotionListener extends MouseMotionAdapter /*內(nèi)部類(lèi)開(kā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)部類(lèi)結(jié)束 3匿名類(lèi)(Anonymous Class) 當(dāng)一個(gè)內(nèi)部類(lèi)的類(lèi)聲名只是在創(chuàng)建此類(lèi)對(duì)象時(shí)用了一次,而且要產(chǎn)生的新類(lèi)需繼承于一個(gè)已有的父類(lèi)或?qū)崿F(xiàn)一個(gè)接口,才能考慮用匿名類(lèi),由于匿名類(lèi)本身無(wú)名,因此它也就不存在構(gòu)造方法,它需要顯示地調(diào)用一個(gè)無(wú)參的父類(lèi)的構(gòu)造方法,并且重寫(xiě)父類(lèi)的方法。所謂的匿名就是該類(lèi)連名字都沒(méi)有,只是顯示地調(diào)用一個(gè)無(wú)參的父類(lèi)的構(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() /匿名類(lèi)開(kāi)始 public void mouseDragged(MouseEvent e) String s=Mouse dragging: x=+e.getX()+Y=+e.getY(); tf.setText(s); ); /匿名類(lèi)結(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)的都是完全一樣的功能,只不過(guò)采取的方式不同。5.11中的事件處理類(lèi)是一個(gè)內(nèi)部類(lèi),而5.12的事件處理類(lèi)是匿名類(lèi),可以說(shuō)從類(lèi)的關(guān)系來(lái)說(shuō)是越來(lái)越不清楚,但是程序也越來(lái)越簡(jiǎn)練。熟悉這兩種方式也十分有助于大家編寫(xiě)圖形界面的程序。 5.3 AWT組件庫(kù)(1) 本節(jié)從應(yīng)用的角度進(jìn)一步介紹AWT的一些組件,目的使大家加深對(duì)AWT的理解,掌握如何用各種組件構(gòu)造圖形化用戶(hù)界面,學(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)聽(tīng)和處理事件。 ActionEvent的對(duì)象調(diào)用getActionCommand()方法可以得到按鈕的標(biāo)識(shí)名,缺省按鈕名為label。 用setActionCommand()可以為按鈕設(shè)置組件標(biāo)識(shí)符。 2.復(fù)選框 (Checkbox) 復(fù)選框提供簡(jiǎn)單的on/off開(kāi)關(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 來(lái)監(jiān)聽(tīng)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接口來(lái)進(jìn)行監(jiān)聽(tīng) 5. Canvas 一個(gè)應(yīng)用程序必須繼承Canvas類(lèi)才能獲得有用的功能,比如創(chuàng)建一個(gè)自定義組件。如果想在畫(huà)布上完成一些圖形處理,則Canvas類(lèi)中的paint()方法必須被重寫(xiě)。 Canvas組件監(jiān)聽(tīng)各種鼠標(biāo),鍵盤(pán)事件。當(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è)畫(huà)布對(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)聽(tīng)器 mc.c.addKeyListener(mc); /注冊(cè)監(jiān)聽(tīng)器 f.setVisible(true); public void mouseClicked(MouseEvent ev) System.out.println(MouseClicked); c.requestFocus();/獲得焦點(diǎn),表示該窗口將接收用戶(hù)的鍵盤(pá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)回車(chē)鍵被按下時(shí),會(huì)發(fā)生ActionEvent事件,可以通過(guò)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è)按鈕,通過(guò)按鈕點(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無(wú)法直接監(jiān)聽(tīng)鍵盤(pán)輸入事件。 10. 對(duì)話框(Dialog) 它是Window類(lèi)的子類(lèi)。對(duì)話框和一般

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論