《Java程序設(shè)計項目化教程》課件-第8章_第1頁
《Java程序設(shè)計項目化教程》課件-第8章_第2頁
《Java程序設(shè)計項目化教程》課件-第8章_第3頁
《Java程序設(shè)計項目化教程》課件-第8章_第4頁
《Java程序設(shè)計項目化教程》課件-第8章_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8章任務(wù)8——處理登錄界面中的事件8.1任務(wù)描述8.2技術(shù)要點8.3任務(wù)實施 8.1任務(wù)描述

本章的任務(wù)是完善用戶登錄界面中的事件處理。在第7章中介紹了利用Swing創(chuàng)建的圖形界面,可以通過AWT中的布局管理器對界面中的組件進(jìn)行布局。但點擊界面中的按鈕沒有任何相關(guān)程序的執(zhí)行,這是因為程序中缺少對這些組件上所發(fā)生的一系列操作的響應(yīng),也就是缺少相應(yīng)這些組件行為的代碼。

事實上,我們希望程序有如下的一系列的響應(yīng):

(1)在考試系統(tǒng)登錄界面中,程序根據(jù)用戶點擊不同按鈕的操作,進(jìn)入相關(guān)的功能模塊。

(2)輸入正確的用戶名及密碼后,點擊【登錄】按鈕可以進(jìn)入考試界面進(jìn)行考試,如圖8-1所示;當(dāng)輸入的用戶名或密碼有誤時,系統(tǒng)將提示相關(guān)錯誤信息,如圖8-2所示;對于新用戶,可以點擊【注冊】按鈕,進(jìn)行用戶注冊,如圖8-3所示。

在Java中,要想使圖形用戶界面對用戶的操作產(chǎn)生響應(yīng),就必須對相應(yīng)的組件添加事件處理代碼。圖8-1登錄界面中的【登錄】按鈕事件響應(yīng)1圖8-2登錄界面中的【登錄】按鈕事件響應(yīng)2圖8-3登錄界面中的【注冊】按鈕事件響應(yīng) 8.2技術(shù)要點

本章任務(wù)的技術(shù)要點是事件處理。事件是用戶對一個動作的啟動。常用的事件包括用戶單擊一個按鈕,在文本框內(nèi)輸入及鼠標(biāo)、鍵盤、窗口等的操作。所謂的事件處理,是指當(dāng)用戶觸發(fā)了某一個事件時,系統(tǒng)所做出的響應(yīng)。Java采用的是委派事件模型的處理機(jī)制,也稱為授權(quán)事件模型。當(dāng)用戶與組件進(jìn)行交互,觸發(fā)了相應(yīng)的事件時,組件本身并不直接處理事件,而是將事件的處理工作委派給事件監(jiān)聽器。不同的事件,可以交由不同類型的監(jiān)聽器去處理。這種事件處理的機(jī)制使得處理事件的應(yīng)用程序邏輯與生成那些事件的用戶界面邏輯(容器與組件)彼此分離,相互獨(dú)立存在。圖8-4描述了委派事件模型的運(yùn)作流程。我們可以看到,事件處理機(jī)制中包含了以下三個要素:事件源、事件(對象)及事件監(jiān)聽器。圖8-4委派事件模型事件源是產(chǎn)生事件的組件,每個事件源可以產(chǎn)生一個或多個事件。例如,文本框JTextField獲得焦點時,按回車鍵則產(chǎn)生動作事件,而修改文本框內(nèi)容時產(chǎn)生的則是文本事件。為了能夠響應(yīng)所產(chǎn)生的事件,事件源必須注冊事件監(jiān)聽器,以便讓事件監(jiān)聽器能夠及時接收到事件源所產(chǎn)生的各類事件。當(dāng)接收到一個事件時,監(jiān)聽器將會自動啟動并執(zhí)行相關(guān)的事件處理代碼來處理該事件。

Java中的所有事件都放在java.awt.AWTEvent包中,這些事件都是從java.util.EventObject類繼承而來的,而java.util.EventObject類又繼承于java.lang.Object類。事件處理類及其繼承關(guān)系如圖8-5所示。圖中,有陰影的7個類是最基礎(chǔ)的事件類,分別是動作事件(ActionEvent)、調(diào)整事件(AdjustmentEvent)、選擇事件(ItemEvent)、文本事件(TextEvent)、窗口事件(WindowsEvent)、鍵盤事件(KeyEvent)和鼠標(biāo)事件(MouseEvent)。我們將在本章重點介紹動作事件、鍵盤事件、焦點事件、鼠標(biāo)事件和窗口事件,其他部分事件類將結(jié)合考試系統(tǒng)的其他功能模塊在后續(xù)章節(jié)中進(jìn)行介紹。圖8-5事件處理類及其繼承關(guān)系表8-1列出了常見的用戶行為、事件源和相關(guān)的事件類型。其中,Component是所有GUI組件的父類,因此每個組件都可以觸發(fā)ComponentEvent下的FocusEvent、FocusEvent、MouseEvent、KeyEven事件。在java.awt.event包中,提供AWT事件所需的大部分的事件類和事件監(jiān)聽器接口,一些Swing組件所特有的事件監(jiān)聽器接口則在javax.swing.event中聲明。如ListSelectionEvent是包含在javax.swing.event中的類。表8-1常見用戶行為、事件源和事件類型對于表8-1中的事件類都有與之對應(yīng)的事件監(jiān)聽器。?Java中的事件監(jiān)聽器大多以接口形式出現(xiàn)。事件類、事件監(jiān)聽器接口以及事件監(jiān)聽器委派的事件處理者之間存在一定的對應(yīng)關(guān)系,如表8-2所示。表8-2事件類、事件監(jiān)聽器接口與事件處理者的關(guān)系8.2.1動作事件(ActionEvent類)

當(dāng)用戶按下按鈕組件(JButton)、雙擊列表(JList)中的選項、選擇菜單項(JMenuItem),或是在文本框(JTextField)或文本區(qū)(TextArea)輸入文字后按下【Enter】鍵的同時,即觸發(fā)了動作事件。此時,觸發(fā)事件的組件將ActionEvent類的對象傳送給向它注冊的監(jiān)聽器ActionListener,由ActionListener負(fù)責(zé)啟動并執(zhí)行相關(guān)代碼來處理這個事件。

表8-3列出了ActionEvent類的常用方法。表8-3ActionEvent類的常用方法動作事件的監(jiān)聽器接口ActionListener中只包含一個方法,語法格式如下:

publicvoidactionPerform(ActionEvente)

重寫該方法對ActionEvent事件進(jìn)行處理,當(dāng)ActionEvent事件發(fā)生時該方法被自動調(diào)用,形式參數(shù)e引用傳遞過來的動作事件對象。

在Java圖形用戶界面中,處理事件時所必需的步驟是:

(1)確定接受響應(yīng)的組件并創(chuàng)建它。

(2)實現(xiàn)相關(guān)事件監(jiān)聽接口。

(3)注冊事件源的動作監(jiān)聽器。

(4)事件觸發(fā)時要進(jìn)行的相關(guān)處理。如圖8-6所示,我們在窗口中設(shè)置了三個按鈕,用戶點擊【確定】按鈕屏幕輸出“確定”,點擊【返回】按鈕則輸出“確定”,按下【退出】按鈕則可以關(guān)閉應(yīng)用程序窗口。具體程序代碼參見例8-1。圖8-6動作事件示例例8-1ButtonListener.java

1importjava.awt.*;

2importjava.awt.event.*;

3importjavax.swing.*;

4classButtonListenerextendsJFrameimplementsActionListener{ //實現(xiàn)監(jiān)聽

5JButtonok,cancel,exit;

6publicButtonListener(Stringtitle){

7super(title);

8this.setLayout(newFlowLayout());

9ok=newJButton("確定"); 10cancel=newJButton(“返回”);

11exit=newJButton(“退出”);

12ok.addActionListener(this); //注冊監(jiān)聽器

13cancel.addActionListener(this)

;

14exit.addActionListener(this);

15getContentPane().add(ok);

16getContentPane().add(cancel);

17getContentPane().add(exit);

18}

19//完成事件觸發(fā)時的相關(guān)處理

20publicvoidactionPerformed(ActionEvente){21if(e.getSource()==ok)

22System.out.println("確定");

23if(e.getSource()==cancel)

24System.out.println("返回");

25if(e.getSource()==exit)

26System.exit(0);;

27}

28publicstaticvoidmain(Stringargs[]){

29ButtonListenerpd=newButtonListener("ActionEventDemo");

30pd.setSize(250,100); 31pd.setVisible(true);

32}

33}

例8-1是利用容器類實現(xiàn)監(jiān)聽接口的,要對容器中的GUI組件進(jìn)行監(jiān)聽,必須在容器類定義時用implements聲明要實現(xiàn)哪些接口,并在類中實現(xiàn)這些接口的所有抽象方法。實際應(yīng)用中,我們也可以用專門的頂層類來實現(xiàn)監(jiān)聽接口,優(yōu)點是可以將處理事件的代碼與創(chuàng)建GUI界面的程序代碼分離;缺點是在監(jiān)聽類中無法直接訪問組件。我們將例8-1進(jìn)行改寫,其中ButtonListener1類負(fù)責(zé)創(chuàng)建GUI界面,MyListener類負(fù)責(zé)監(jiān)聽ActionEvent事件,利用一個監(jiān)聽器類實現(xiàn)了對多個可能產(chǎn)生同類型事件的組件進(jìn)行監(jiān)聽和處理。例8-2ButtonListener1.java

1importjava.awt.*;

2importjava.awt.event.*;

3importjavax.swing.*;

4classButtonListener1extendsJFrame{//創(chuàng)建GUI界面

5JButtonok,cancel,exit;

6publicButtonListener1(Stringtitle){

7super(title);

8this.setLayout(newFlowLayout());

9ok=newJButton("確定");10cancel=newJButton("返回");

11exit=newJButton("退出");

12ok.addActionListener(newMyListener());

13cancel.addActionListener(newMyListener());;

14exit.addActionListener(newMyListener());;

15getContentPane().add(ok);

16getContentPane().add(cancel);

17getContentPane().add(exit);

18}

19publicstaticvoidmain(Stringargs[]){ 20ButtonListenerpd=newButtonListener(“ActionEventDemo”);

21pd.setSize(250,100);

22pd.setVisible(true);

23?}

24}

25classMyListenerimplementsActionListener{//監(jiān)聽動作事件

26publicvoidactionPerformed(ActionEvente){

27 if(e.getActionCommand()=="確定")

28 System.out.println("確定");29if(e.getActionCommand()=="返回")

30 System.out.println("返回");

31if(e.getActionCommand()=="退出")

32 System.exit(0);

33}

34}8.2.2鍵盤事件(KeyEvent類)

鍵盤事件是由具有鍵盤焦點的組件在用戶按下或釋放鍵盤某個鍵時引發(fā)的KeyEvent事件。處理KeyEvent事件的監(jiān)聽器接口是KeyListener,其中包含三個抽象方法。Java規(guī)定,接口中的方法必須全部實現(xiàn),因此盡管在實際應(yīng)用中可能僅需要用到一個或者其中幾個方法,但每次實現(xiàn)KeyListener接口的類都必須實現(xiàn)其所有抽象方法。

對于后續(xù)章節(jié)所介紹的MouseListener、MouseMotionListener、WindowListener也存在類似情況。

表8-4所示為KeyListener接口中的所有方法。表8-4KeyListener接口中的所有方法在例8-3中,定義了JTextField組件tf,用于接收鍵盤的輸入;JTextArea組件ta,用于顯示當(dāng)前所觸發(fā)KeyEvent事件的種類。例8-3KeyEventDemo.java

1importjava.awt.*;

2importjava.awt.event.*;

3importjavax.swing.*;

4publicclassKeyEventDemoextendsJFrameimplementsKeyListener{

5staticKeyEventDemofrm=newKeyEventDemo();

6staticJTextFieldtf=newJTextField(20);

7staticJTextAreata=newJTextArea("",5,20);

8publicstaticvoidmain(Stringargs[]){

9frm.setSize(200,150); 10frm.setTitle("KeyEventDemo");

11frm.setLayout(newFlowLayout(FlowLayout.CENTER));

12tf.addKeyListener(frm);

13ta.setEditable(false);

14frm.add(tf);

15frm.add(ta);

16frm.setVisible(true);

17}

18//當(dāng)tf組件觸發(fā)KeyEvent事件時,根據(jù)事件的種類執(zhí)行下列的程序代碼19publicvoidkeyPressed(KeyEvente){//當(dāng)按鍵按下時

20ta.setText("");

21ta.append("keyPressed()被調(diào)用\n");

22}

23publicvoidkeyReleased(KeyEvente){//當(dāng)按鍵放開時

24ta.append("keyReleased()被調(diào)用\n");

25}

26publicvoidkeyTyped(KeyEvente){//鍵入內(nèi)容時

27ta.append("keyTyped()被調(diào)用\n");

28}

29}程序運(yùn)行結(jié)果如圖8-7所示。圖8-7鍵盤事件示例8.2.3焦點事件(FocusEvent類)

組件獲得或失去焦點(focus)時,都會產(chǎn)生該焦點事件。所有的組件都能產(chǎn)生FocusEvent事件,比較常見的是JTextField和JButton上的焦點事件。當(dāng)鼠標(biāo)單擊文本框時,文本框?qū)@得焦點,獲得焦點的文本框內(nèi)出現(xiàn)閃爍的光標(biāo)表示可以接收鍵盤的輸入,如圖8-8所示。當(dāng)按鈕獲得焦點時,將出現(xiàn)一個虛框,如圖8-9所示。FocusEvent事件相關(guān)的FocusListener接口中包含兩個抽象方法focusGained和focusLost,如表8-5所示。圖8-8文本框獲得焦點圖8-9文本框失去焦點表8-5FocusListener接口中的所有方法例8-4演示了文本框上FocusEvent事件的處理,程序運(yùn)行效果如圖8-8和圖8-9所示,當(dāng)用鼠標(biāo)單擊文本框時,標(biāo)簽處提示“文本框獲得焦點”;當(dāng)用鼠標(biāo)單擊按鈕時,標(biāo)簽處提示“文本框失去焦點”。例8-4FocusEventDemo.java

1importjava.awt.*;

2importjava.awt.event.*;

3importjavax.swing.*;

4publicclassFocusEventDemoextendsJFrameimplementsFocusListener{

5JTextFieldtf=newJTextField("文本框");

6JButtonjb=newJButton("按鈕");

7JLabeljlab=newJLabel("");

8publicFocusEventDemo(Stringtitle){

9 super(title);10 this.getContentPane().add(jlab,"North");

11 this.getContentPane().add(tf,"Center");

12 this.getContentPane().add(jb,"South");

13 tf.addFocusListener(this);

14}

15publicvoidfocusGained(FocusEvente){

16if(e.getSource()==tf)

17jlab.setText("文本框獲得焦點");

18}

19publicvoidfocusLost(FocusEvente){

20if(e.getSource()==tf) 21jlab.setText("文本框失去焦點");

22}

23publicstaticvoidmain(String[]args){

24FocusEventDemof=newFocusEventDemo("FocusEventDemo");

25f.setSize(300,200);

26f.setVisible(true);

27}

28}8.2.4鼠標(biāo)事件(MouseEvent類)

鼠標(biāo)事件是用戶使用鼠標(biāo)在某個組件上進(jìn)行某種動作時發(fā)生的事件。例如鼠標(biāo)單擊組件、鼠標(biāo)移入組件區(qū)域、鼠標(biāo)移出組件區(qū)域等都會發(fā)生MouseEvent事件。

MouseEvent類的主要方法如表8-6所示。表8-6MouseEvent類的常用方法表中,getButton()方法的返回值如下:

■MouseEvent.NOBUTTON(=0):無鼠標(biāo)按鈕發(fā)生狀態(tài)改變。

■MouseEvent.BUTTON1(=1):鼠標(biāo)左鍵發(fā)生狀態(tài)改變。

■MouseEvent.BUTTON2(=2):鼠標(biāo)中鍵發(fā)生狀態(tài)改變。

■MouseEvent.BUTTON3(=3):鼠標(biāo)右鍵發(fā)生狀態(tài)改變

與MouseEvent相對應(yīng)的鼠標(biāo)事件監(jiān)聽接口為MouseListener和MouseMotionListener。

MouseListener接口主要處理鼠標(biāo)單擊、按下、釋放、移入組件和移出組件的事件,該接口包含五個方法,如表8-7所示。表8-7MouseListener接口中的方法

MouseMotionListener接口負(fù)責(zé)處理與鼠標(biāo)拖放和移動相關(guān)的事件,該接口包含兩個方法,如表8-8所表示。表8-8MouseMotionListener接口中的所有方法8.2.5窗口事件(WindowEvent類)

窗口事件是發(fā)生在窗口對象上的事件。當(dāng)用戶或應(yīng)用程序在打開、關(guān)閉、最大或最小化窗口等時觸發(fā)WindowEvent事件。處理WindowEvent事件需要實現(xiàn)WindowListener接口,其中聲明了7個用來處理不同事件的抽象方法,如表8-9所示。表8-9WindowListener接口中的所有方法例8-5是鼠標(biāo)事件和窗口事件的綜合應(yīng)用實例。窗口中的標(biāo)簽區(qū)域為鼠標(biāo)的活動區(qū)域,利用MouseListener、MouseMotionListener對鼠標(biāo)狀態(tài)進(jìn)行監(jiān)聽,并把鼠標(biāo)當(dāng)前狀態(tài)顯示在下方的文本框內(nèi)。同時,利用WindowListener對當(dāng)前窗口的狀態(tài)進(jìn)行監(jiān)聽,當(dāng)窗口被激活時,文本框顯示響應(yīng)提示信息。程序運(yùn)行效果如圖8-10所示。圖8-10鼠標(biāo)事件和窗口事件示例例8-5MouseAndWindowEvent.java

1importjava.awt.*;

2importjava.awt.event.*;

3importjavax.swing.*;

4publicclassMouseAndWindowsEventimplements

MouseListener,MouseMotionListener,WindowListener{

5 privateJFramef;

6 privateJTextFieldtf;

7 publicstaticvoidmain(Stringargs[]){

8 MouseAndWindowsEventml=newMouseAndWindowsEvent(); 9 ml.go();

10 }

11 publicvoidgo(){

12 JFramef=newJFrame("MouseandWindowsEventDemo");

13 f.getContentPane().add(newLabel("鼠標(biāo)活動區(qū)域"),"North");

14 tf=newJTextField(30);

15 f.getContentPane().add(tf,"South");

16f.addMouseListener(this);

17 f.addMouseMotionListener(this); 18f.addWindowListener(this);

19f.setSize(330,200);

20f.setVisible(true);

21 }

22 //MouseMotionListener

23 publicvoidmouseDragged(MouseEvente){

24 tf.setText("TheMouseDragged");

25}

26 publicvoidmouseMoved(MouseEvente){

27 tf.setText("ThemouseMoved");

28 }29 //MouseListener

30 publicvoidmouseEntered(MouseEvente){

31 tf.setText("ThemouseEntered");

32 }

33 publicvoidmouseExited(MouseEvente){

34 tf.setText("ThemouseExited");

35 }

36 publicvoidmouseClicked(MouseEvente){

37 tf.setText("ThemouseClicked");

38 }

39 publicvoidmousePressed(MouseEvente){}40 publicvoidmouseReleased(MouseEvente){}

41 publicvoidwindowClosing(WindowEvente){

42 System.exit(1);

43 }

44 publicvoidwindowClosed(WindowEvente){}

45 publicvoidwindowOpened(WindowEvente){}

46 publicvoidwindowIconified(WindowEvente){}

47 publicvoidwindowDeiconified(WindowEvente){}

48 publicvoidwindowDeactivated(WindowEvente){}

49 publicvoidwindowActivated(WindowEvente){

50 tf.setText("ThewindowActivated"); 51 }

52} 8.3任務(wù)實施

在第7章的例7-7中沒有編寫對界面組件的事件處理的程序,因此點擊按鈕無任何反應(yīng)。根據(jù)本章8.1節(jié)登錄模塊的事件處理預(yù)覽中的介紹,登錄模塊中主要涉及的為鼠標(biāo)點擊按鈕所觸發(fā)的動作事件ActionEvent。本節(jié)我們將在例7-7的基礎(chǔ)上將事件處理代碼補(bǔ)充完整,主要對【登錄】、【注冊】、【取消】三個按鈕添加事件處理代碼。在例7-7中的LoginPanel類中,首先注明所要實現(xiàn)的事件處理的接口,如:

classLoginPanelextendsJPanelimplementsActionListener

并在其構(gòu)造方法LoginPanel中對三個按鈕注冊動作事件監(jiān)聽器。

loginbtn.addActionListener(this); //登錄按鈕

registerbtn.addActionListener(this); //注冊按鈕

cancelbtn.addActionListener(this); //取消按鈕

相關(guān)事件的處理代碼段如例8-6所示。例8-6登錄模塊中的事件處理代碼。

1publicvoidactionPerformed(ActionEvente){

2 if(e.getSource()==l

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論