Java程序設(shè)計(第3版)課件 單元4-任務(wù)3 計算器事件處理_第1頁
Java程序設(shè)計(第3版)課件 單元4-任務(wù)3 計算器事件處理_第2頁
Java程序設(shè)計(第3版)課件 單元4-任務(wù)3 計算器事件處理_第3頁
Java程序設(shè)計(第3版)課件 單元4-任務(wù)3 計算器事件處理_第4頁
Java程序設(shè)計(第3版)課件 單元4-任務(wù)3 計算器事件處理_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

任務(wù)三計算器事件處理單元四:圖形用戶界面程序設(shè)計教學目標知識目標Java委托事件處理機制。常用事件類;處理事件接口;動作事件。能力目標能會使用Java委托事件處理機制完成事件處理。運用編寫事件處理程序的基本方法完成程序編寫;應(yīng)用按鈕ActionEvent動作事件的處理進行程序設(shè)計。教學內(nèi)容4任務(wù)陳述123知識準備任務(wù)實施任務(wù)拓展任務(wù)實訓5 1.任務(wù)陳述任務(wù)描述實現(xiàn)計算器計算功能。在上個任務(wù)基礎(chǔ)上,添加用戶操作響應(yīng)代碼即事件處理代碼,完成計算器功能,運行結(jié)果如下圖所示: 2.知識準備Java事件處理機制如果用戶在GUI層執(zhí)行了一個動作,如點擊了鼠標、輸入了一個字符、選擇了列表框中的一項等,將導(dǎo)致一個事件的發(fā)生Java事件處理,采用的是事件源——事件監(jiān)聽器模型的委托事件處理機制,無論應(yīng)用程序還是小程序都采用這一機制

2.知識準備AWT事件模型:事件是EventObject子類的對象描述在某個時間,某個對象上,發(fā)生了某件事情通過鼠標、鍵盤與GUI界面直接或間接交互都會生成事件。如:按下一個按鈕、通過鍵盤輸入一個字符、選擇列表框中的一項、點擊一下鼠標等。事件不局限于界面操作,比如網(wǎng)絡(luò)連接或斷開等都可看作是事件任務(wù)中,ActionEvent的對象就是一個事件,描述在按鈕上點擊了鼠標

2.知識準備AWT事件模型:事件源是生成事件對象的對象用事件對象來描述自身狀態(tài)的改變,即在某時刻,其上發(fā)生了什么事情可以通過回調(diào)規(guī)定接口對象,將事件發(fā)送給其他對象,以使其他對象對事件作出反應(yīng)成為可能上例中,buttonGetNumber

就是事件源

2.知識準備AWT事件模型:監(jiān)聽器是對某類事件感興趣,并希望做出響應(yīng)的對象必須實現(xiàn)規(guī)定接口,此類接口稱為監(jiān)聽器接口上例中,GuessExample2的對象就是監(jiān)聽器,實現(xiàn)了ActionListener接口,希望當在buttonGetNumber點擊后生成一個隨機數(shù)字 2.知識準備AWT事件模型——事件處理關(guān)鍵步驟:實現(xiàn)監(jiān)聽器接口,定義監(jiān)聽器類,在接口規(guī)定方法內(nèi)實現(xiàn)事件處理邏輯創(chuàng)建監(jiān)聽器對象,將監(jiān)聽器添加到事件源事件發(fā)生,事件源回調(diào)監(jiān)聽器中相關(guān)方法 2.知識準備FocusEventAWTEventActionEventAdjustmentEventComponentEventTextEventItemEventContainerEventInputEventWindowEventPaintEventKeyEventMouseEventEventObject事件體系結(jié)構(gòu) 2.知識準備事件類說明事件源ActionEvent通常按下按鈕,雙擊列表項或選中一個菜單項時,就會生成此事件。Button、List、MenuItem、TextFieldAdjustmentEvent操縱滾動條時會生成此事件。ScrollbarComponentEvent當一個組件移動、隱藏、調(diào)整大小或成為可見時會生成此事件。ComponentItemEvent單擊復(fù)選框或列表項時,或者當一個選擇框或一個可選菜單的項被選擇或取消時生成此事件。Checkbox、CheckboxMenuItem、Choice、ListFocusEvent組件獲得或失去鍵盤焦點時會生成此事件。Component 2.知識準備事件類說明事件源KeyEvent接收到鍵盤輸入時會生成此事件。ComponentMouseEvent拖動、移動、單擊、按下或釋放鼠標或在鼠標進入或退出一個組件時,會生成此事件。ComponentContainerEvent將組件添加至容器或從中刪除時會生成此事件。ContainerTextEvent在文本區(qū)或文本域的文本改變時會生成此事件。TextField、TextAreaWindowEvent當一個窗口激活、關(guān)閉、失效、恢復(fù)、最小化、打開或退出時會生成此事件。

Window 2.知識準備事件類ActionEvent主要方法publicActionEvent(Object

source,int

id,String

command);String

getActionCommand();longgetWhen();publicObject

getSource();publicvoidsetSource(Object

newSource); 2.知識準備監(jiān)聽器通過實現(xiàn)java.awt.event包中定義的一個或多個接口來創(chuàng)建在發(fā)生事件時,事件源將調(diào)用監(jiān)聽器定義的相應(yīng)方法有興趣接收事件的任何監(jiān)聽器類都必須實現(xiàn)監(jiān)聽器接口 2.知識準備事件監(jiān)聽器方法ActionListener

actionPerformed

AdjustmentListener

adjustmentValueChanged

ComponentListener

componentResizedcomponentMovedcomponentShowncomponentHidden

ContainerListener

componentAddedcomponentRemoved

FocusListener

focusLost、focusGained

ItemListener

itemStateChanged

2.知識準備事件監(jiān)聽器方法KeyListener

keyPressed、keyReleasedkeyTyped

MouseListener

mouseClicked、mouseEnteredmouseExited、mousePressedmouseReleased

MouseMotionListener

mouseDragged、mouseMoved

TextListener

textChanged

WindowListener

windowActivated、windowDeactivatedwindowClosed、windowClosingwindowIconified、windowDeiconifiedwindowOpened

2.知識準備監(jiān)聽器接口定義InterfaceActionListener{ voidactionPerformed(ActionEvent

e);} 2.知識準備更多事件介紹焦點事件窗口事件鼠標事件…… 2.知識準備焦點事件任何GUI對象的獲得或失去焦點都被視為焦點事件,并且事件源必須向事件監(jiān)聽器通知事件對象已失去或已獲得焦點焦點監(jiān)聽器需要實現(xiàn)兩個方法:focusGained和focusLost對組件輸入數(shù)據(jù)要進行錯誤檢查或范圍校驗時,對焦點的捕捉就顯得尤其重要 2.知識準備FocusEvent

特有方法Component

getOppositeComponent()返回焦點變化事件中的另一組件booleanisTemporary()說明此事件是臨時還是永久的String

paramString()獲取說明此事件的一字符串 2.知識準備窗口事件當一個窗口被激活、禁止、關(guān)閉、正在關(guān)閉、最小化、恢復(fù)、打開時將生成窗口事件。需要實現(xiàn)的方法如下:windowActivated、windowDeactivatedwindowClosing、windowClosedwindowDeiconified、windowIconifiedwindowOpened 2.知識準備WindowEvent

特有方法intgetNewState()WINDOW_STATE_CHANGED事件的新狀態(tài)intgetOldState()WINDOW_STATE_CHANGED事件的原狀態(tài)Window

getOppositeWindow()焦點或激活事件的另一影響窗口Window

getWindow()事件創(chuàng)建窗口String

paramString() 2.知識準備鍵盤事件在按下或釋放鍵盤上的一個鍵時,將生成鍵盤事件keyEvent類包含用來表示按下或點擊的鍵的常量生成keyEvent時將調(diào)用keyListener如果程序需要處理特殊的鍵,如方向鍵,需要通過調(diào)用keyPressed()方法來處理 2.知識準備KeyEvent特有方法chargetKeyChar()

intgetKeyCode()static

String

getKeyText(int

keyCode)鍵碼表VK_0……VK_9、

VK_A……VK_Z 2.知識準備鼠標事件任何時候移動、單擊、按下或釋放鼠標,都會生成鼠標事件。鼠標事件有兩種監(jiān)聽器:MouseListener和MouseMotionListener。需要實現(xiàn)的方法如下:

mouseClicked、mouseEntered、mouseExitedmousePressed、mouseReleasedmouseDragged、mouseMoved 2.知識準備MouseEvent特有方法intgetButton()intgetX()intgetY()常量定義BUTTON1

、BUTTON2

、BUTTON3 2.知識準備publicvoidmouseClicked(MouseEventm){intx=m.getX();inty=m.getY();

intclickCount=m.getClickCount();if(clickCount==2){Graphicsg=getGraphics();g.drawString("鼠標雙擊!",x,y);g.dispose();}}

獲得點擊鼠標時鼠標指針的x及y坐標

確定單擊和雙擊鼠標事件示例適配器類適配器類

事件監(jiān)聽器接口

ComponentAdapterComponentListenerContainerAdapterContainerListenerFocusAdapterFocusListenerKeyAdapterKeyListenerMouseAdapterMouseListenerMouseMotionAdapterMouseMotionListenerWindowAdapterWindowListener為了使事件處理變得簡單,Java為具有多個方法的監(jiān)聽器接口提供適配器類。適配器類實現(xiàn)并提供了一個事件監(jiān)聽器接口中的所有的方法,但這些方法都是空方法。privateclassMyMouseAdapterextendsMouseAdapter{privateColorbgColor;

publicMyMouseAdapter(Colorc){bgColor=c;}

publicvoidmouseClicked(MouseEventmevent){setBackground(bgColor);repaint();

}}

匿名類匿名類就是沒有指定名稱的類可以便于編寫事件處理程序classMyPanelextendsPanel{

publicMyPanel(){

ButtonbButton=newButton("藍色");

add(bButton);bButton.addMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEventmevent){setBackground(Color.blue);repaint();}});

} 3.任務(wù)實施實施思路與方案修改Calculator類定義使其實現(xiàn)ActionListener接口在actionPerformed方法中添加事件處理代碼并且為每個按鈕添加this(代表當前窗口對象)作為監(jiān)聽器 3.任務(wù)實施解決步驟,在本單元任務(wù)二中Calculator類的代碼上,做如下修改:1)導(dǎo)入事件處理相關(guān)包java.awt.event.*2)修改Calculator類使其實現(xiàn)接口ActionListener3)增加actionPerformed方法,編寫按鈕點擊處理代碼,實現(xiàn)計算功能4)為每一個按鈕對象添加當前Calculator類對象(this)作為監(jiān)聽器 3.任務(wù)實施同任務(wù)二相比,增加內(nèi)容包括:publicclassCalculatorextendsJFrameimplementsActionListener{類聲明增加了實現(xiàn)ActionListener接口 3.任務(wù)實施同任務(wù)二相比,增加內(nèi)容包括:jb=newJButton(""+i);jb.addActionListener(this);keyPanel.add(jb);每個按鈕對象都增加addActionListener(this);方法調(diào)用,將當前計算器窗口對象作為事件監(jiān)聽器 3.任務(wù)實施同任務(wù)二相比,增加內(nèi)容包括:publicvoidactionPerformed(ActionEvente){……//重寫ActionListener接口的這個方法//處理按鈕點擊事件,實現(xiàn)計算功能} 3.任務(wù)實施actionPerformed方法內(nèi)容: //獲取當前點擊按鈕文本

Stringcmd=e.getActionCommand();

//獲取結(jié)果顯示文本條文本

Stringc=result.getText(); //如果點擊“清空”按鈕,顯示內(nèi)容設(shè)為空 if(cmd.equals("清空")){ result.setText(""); } 3.任務(wù)實施actionPerformed方法內(nèi)容:elseif(cmd.equals("退格")){ if(c.length()>0){ Stringslast=c.substring(c.length()-1); if(slast.equals("+")||slast.equals("-")||slast.equals("*")||slast.equals("/")){calculate_type=0;/*

如果刪除了運算符,將計算類型恢復(fù)為未確定狀態(tài)*/} result.setText(c.substring(0,c.length()-1));}} 3.任務(wù)實施actionPerformed方法內(nèi)容://如果點擊了數(shù)字或小數(shù)點按鈕,在顯示中增加//對應(yīng)數(shù)字或小數(shù)點elseif(pareTo("0")>=0&&pareTo("9")<=0){ result.setText(c+cmd);}elseif(cmd.equals(".")){ result.setText(c+cmd);} 3.任務(wù)實施actionPerformed方法內(nèi)容:elseif(cmd.equals("+")||cmd.equals("-")||cmd.equals("*")||cmd.equals("/")){ if(calculate_type==0){//自上次計算完成后,第一次點擊運算符

result.setText(c+cmd); judgeCalculateType(cmd);//判斷計算類型

} } 3.任務(wù)實施actionPerformed方法內(nèi)容:else{ //自上次計算完成后,第二次點擊運算符,觸發(fā)計算

calculate(); result.setText(result.getText()+cmd); judgeCalculateType(cmd);//判斷計算類型

}} 3.任務(wù)實施actionPerformed方法內(nèi)容:elseif(cmd.equals("=")){//點擊=進行計算

try{ calculate(); } catch(Exceptionexp){ JOptionPane.showMessageDialog(this,"輸入錯誤,請檢查輸出或重新啟動程序");}}} 3.任務(wù)實施judgeCalculateType方法內(nèi)容: if(cmd.equals("+")) calculate_type=1;//記錄運算類型

elseif(cmd.equals("-")) calculate_type=2; elseif(cmd.equals("*")) calculate_type=3; else calculate_type=4; 3.任務(wù)實施calculate方法內(nèi)容:doublert,op1,op2;Stringc=result.getText();intpos;charops[]=newchar[]{'+','-','*','/'}; //查找運算符位置pos=c.indexOf(ops[calculate_type-1]); //以運算符位置為分界點分離出兩個待計算的數(shù)op1=Double.parseDouble(c.substring(0,pos));op2=Double.parseDouble(c.substring(pos+1));

3.任務(wù)實施calculate方法內(nèi)容: switch(calculate_type){ case1:rt=op1+op2;break; case2:rt=op1-op2;break; case3:rt=op1*op2;break; case4:rt=op1/op2;break; default:rt=0; } result.setText(""+rt);//顯示計算結(jié)果

calculate_type=0; //準備記錄下次計算的類型

4.任務(wù)拓展事件機制原理目的加深事件機制理解深入理解接口在合作開發(fā)中的作用真正學會使用接口合作開發(fā)的典型案例組件開發(fā)者組件使用者 4.任務(wù)拓展事件處理的任務(wù)當組件發(fā)生某種事件時,要設(shè)法通知組件使用者,并允許組件使用者做出個性化的處理組件使用者的不確定性定義組件的目的就是在組件設(shè)計完成后到處可以重復(fù)使用此組件。 因此,組件設(shè)計在前,組件使用在后。在定義組件類時,我們并不知道將來誰要使用此組件,從而也就無法確定誰要接收并處理此組件產(chǎn)生的事件?,F(xiàn)在的任務(wù)就是要找一種辦法,將事件消息正確的傳遞給將來的不確定的組件使用者。如下圖所示 4.任務(wù)拓展事件源如:文本框(對象一)監(jiān)視器如:主窗口(對象二)回車鍵在文本框上按下事件消息不能事先確定事件機制原理示意圖 4.任務(wù)拓展事件處理要解決的問題如何知道誰要接收消息?如何傳遞消息?如何傳遞消息數(shù)據(jù)? 4.任務(wù)拓展如何知道誰要接收消息消息的接收者在使用組件時,先向該組件進行注冊。為此,組件應(yīng)實現(xiàn)注冊方法。比如JTextField類的addActionListener()方法 4.任務(wù)拓展如何傳遞消息消息的接收者向組件注冊,組件就擁有了消息接收對象的引用。向消息接收對象傳遞消息最自然的方法就是調(dià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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論