版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章任務8——處理登錄界面中的事件8.1任務描述8.2技術要點8.3任務實施 8.1任務描述
本章的任務是完善用戶登錄界面中的事件處理。在第7章中介紹了利用Swing創(chuàng)建的圖形界面,可以通過AWT中的布局管理器對界面中的組件進行布局。但點擊界面中的按鈕沒有任何相關程序的執(zhí)行,這是因為程序中缺少對這些組件上所發(fā)生的一系列操作的響應,也就是缺少相應這些組件行為的代碼。
事實上,我們希望程序有如下的一系列的響應:
(1)在考試系統(tǒng)登錄界面中,程序根據用戶點擊不同按鈕的操作,進入相關的功能模塊。
(2)輸入正確的用戶名及密碼后,點擊【登錄】按鈕可以進入考試界面進行考試,如圖8-1所示;當輸入的用戶名或密碼有誤時,系統(tǒng)將提示相關錯誤信息,如圖8-2所示;對于新用戶,可以點擊【注冊】按鈕,進行用戶注冊,如圖8-3所示。
在Java中,要想使圖形用戶界面對用戶的操作產生響應,就必須對相應的組件添加事件處理代碼。圖8-1登錄界面中的【登錄】按鈕事件響應1圖8-2登錄界面中的【登錄】按鈕事件響應2圖8-3登錄界面中的【注冊】按鈕事件響應 8.2技術要點
本章任務的技術要點是事件處理。事件是用戶對一個動作的啟動。常用的事件包括用戶單擊一個按鈕,在文本框內輸入及鼠標、鍵盤、窗口等的操作。所謂的事件處理,是指當用戶觸發(fā)了某一個事件時,系統(tǒng)所做出的響應。Java采用的是委派事件模型的處理機制,也稱為授權事件模型。當用戶與組件進行交互,觸發(fā)了相應的事件時,組件本身并不直接處理事件,而是將事件的處理工作委派給事件監(jiān)聽器。不同的事件,可以交由不同類型的監(jiān)聽器去處理。這種事件處理的機制使得處理事件的應用程序邏輯與生成那些事件的用戶界面邏輯(容器與組件)彼此分離,相互獨立存在。圖8-4描述了委派事件模型的運作流程。我們可以看到,事件處理機制中包含了以下三個要素:事件源、事件(對象)及事件監(jiān)聽器。圖8-4委派事件模型事件源是產生事件的組件,每個事件源可以產生一個或多個事件。例如,文本框JTextField獲得焦點時,按回車鍵則產生動作事件,而修改文本框內容時產生的則是文本事件。為了能夠響應所產生的事件,事件源必須注冊事件監(jiān)聽器,以便讓事件監(jiān)聽器能夠及時接收到事件源所產生的各類事件。當接收到一個事件時,監(jiān)聽器將會自動啟動并執(zhí)行相關的事件處理代碼來處理該事件。
Java中的所有事件都放在java.awt.AWTEvent包中,這些事件都是從java.util.EventObject類繼承而來的,而java.util.EventObject類又繼承于java.lang.Object類。事件處理類及其繼承關系如圖8-5所示。圖中,有陰影的7個類是最基礎的事件類,分別是動作事件(ActionEvent)、調整事件(AdjustmentEvent)、選擇事件(ItemEvent)、文本事件(TextEvent)、窗口事件(WindowsEvent)、鍵盤事件(KeyEvent)和鼠標事件(MouseEvent)。我們將在本章重點介紹動作事件、鍵盤事件、焦點事件、鼠標事件和窗口事件,其他部分事件類將結合考試系統(tǒng)的其他功能模塊在后續(xù)章節(jié)中進行介紹。圖8-5事件處理類及其繼承關系表8-1列出了常見的用戶行為、事件源和相關的事件類型。其中,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中的事件類都有與之對應的事件監(jiān)聽器。?Java中的事件監(jiān)聽器大多以接口形式出現。事件類、事件監(jiān)聽器接口以及事件監(jiān)聽器委派的事件處理者之間存在一定的對應關系,如表8-2所示。表8-2事件類、事件監(jiān)聽器接口與事件處理者的關系8.2.1動作事件(ActionEvent類)
當用戶按下按鈕組件(JButton)、雙擊列表(JList)中的選項、選擇菜單項(JMenuItem),或是在文本框(JTextField)或文本區(qū)(TextArea)輸入文字后按下【Enter】鍵的同時,即觸發(fā)了動作事件。此時,觸發(fā)事件的組件將ActionEvent類的對象傳送給向它注冊的監(jiān)聽器ActionListener,由ActionListener負責啟動并執(zhí)行相關代碼來處理這個事件。
表8-3列出了ActionEvent類的常用方法。表8-3ActionEvent類的常用方法動作事件的監(jiān)聽器接口ActionListener中只包含一個方法,語法格式如下:
publicvoidactionPerform(ActionEvente)
重寫該方法對ActionEvent事件進行處理,當ActionEvent事件發(fā)生時該方法被自動調用,形式參數e引用傳遞過來的動作事件對象。
在Java圖形用戶界面中,處理事件時所必需的步驟是:
(1)確定接受響應的組件并創(chuàng)建它。
(2)實現相關事件監(jiān)聽接口。
(3)注冊事件源的動作監(jiān)聽器。
(4)事件觸發(fā)時要進行的相關處理。如圖8-6所示,我們在窗口中設置了三個按鈕,用戶點擊【確定】按鈕屏幕輸出“確定”,點擊【返回】按鈕則輸出“確定”,按下【退出】按鈕則可以關閉應用程序窗口。具體程序代碼參見例8-1。圖8-6動作事件示例例8-1ButtonListener.java
1importjava.awt.*;
2importjava.awt.event.*;
3importjavax.swing.*;
4classButtonListenerextendsJFrameimplementsActionListener{ //實現監(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ā)時的相關處理
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是利用容器類實現監(jiān)聽接口的,要對容器中的GUI組件進行監(jiān)聽,必須在容器類定義時用implements聲明要實現哪些接口,并在類中實現這些接口的所有抽象方法。實際應用中,我們也可以用專門的頂層類來實現監(jiān)聽接口,優(yōu)點是可以將處理事件的代碼與創(chuàng)建GUI界面的程序代碼分離;缺點是在監(jiān)聽類中無法直接訪問組件。我們將例8-1進行改寫,其中ButtonListener1類負責創(chuàng)建GUI界面,MyListener類負責監(jiān)聽ActionEvent事件,利用一個監(jiā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ī)定,接口中的方法必須全部實現,因此盡管在實際應用中可能僅需要用到一個或者其中幾個方法,但每次實現KeyListener接口的類都必須實現其所有抽象方法。
對于后續(xù)章節(jié)所介紹的MouseListener、MouseMotionListener、WindowListener也存在類似情況。
表8-4所示為KeyListener接口中的所有方法。表8-4KeyListener接口中的所有方法在例8-3中,定義了JTextField組件tf,用于接收鍵盤的輸入;JTextArea組件ta,用于顯示當前所觸發(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//當tf組件觸發(fā)KeyEvent事件時,根據事件的種類執(zhí)行下列的程序代碼19publicvoidkeyPressed(KeyEvente){//當按鍵按下時
20ta.setText("");
21ta.append("keyPressed()被調用\n");
22}
23publicvoidkeyReleased(KeyEvente){//當按鍵放開時
24ta.append("keyReleased()被調用\n");
25}
26publicvoidkeyTyped(KeyEvente){//鍵入內容時
27ta.append("keyTyped()被調用\n");
28}
29}程序運行結果如圖8-7所示。圖8-7鍵盤事件示例8.2.3焦點事件(FocusEvent類)
組件獲得或失去焦點(focus)時,都會產生該焦點事件。所有的組件都能產生FocusEvent事件,比較常見的是JTextField和JButton上的焦點事件。當鼠標單擊文本框時,文本框將獲得焦點,獲得焦點的文本框內出現閃爍的光標表示可以接收鍵盤的輸入,如圖8-8所示。當按鈕獲得焦點時,將出現一個虛框,如圖8-9所示。FocusEvent事件相關的FocusListener接口中包含兩個抽象方法focusGained和focusLost,如表8-5所示。圖8-8文本框獲得焦點圖8-9文本框失去焦點表8-5FocusListener接口中的所有方法例8-4演示了文本框上FocusEvent事件的處理,程序運行效果如圖8-8和圖8-9所示,當用鼠標單擊文本框時,標簽處提示“文本框獲得焦點”;當用鼠標單擊按鈕時,標簽處提示“文本框失去焦點”。例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鼠標事件(MouseEvent類)
鼠標事件是用戶使用鼠標在某個組件上進行某種動作時發(fā)生的事件。例如鼠標單擊組件、鼠標移入組件區(qū)域、鼠標移出組件區(qū)域等都會發(fā)生MouseEvent事件。
MouseEvent類的主要方法如表8-6所示。表8-6MouseEvent類的常用方法表中,getButton()方法的返回值如下:
■MouseEvent.NOBUTTON(=0):無鼠標按鈕發(fā)生狀態(tài)改變。
■MouseEvent.BUTTON1(=1):鼠標左鍵發(fā)生狀態(tài)改變。
■MouseEvent.BUTTON2(=2):鼠標中鍵發(fā)生狀態(tài)改變。
■MouseEvent.BUTTON3(=3):鼠標右鍵發(fā)生狀態(tài)改變
與MouseEvent相對應的鼠標事件監(jiān)聽接口為MouseListener和MouseMotionListener。
MouseListener接口主要處理鼠標單擊、按下、釋放、移入組件和移出組件的事件,該接口包含五個方法,如表8-7所示。表8-7MouseListener接口中的方法
MouseMotionListener接口負責處理與鼠標拖放和移動相關的事件,該接口包含兩個方法,如表8-8所表示。表8-8MouseMotionListener接口中的所有方法8.2.5窗口事件(WindowEvent類)
窗口事件是發(fā)生在窗口對象上的事件。當用戶或應用程序在打開、關閉、最大或最小化窗口等時觸發(fā)WindowEvent事件。處理WindowEvent事件需要實現WindowListener接口,其中聲明了7個用來處理不同事件的抽象方法,如表8-9所示。表8-9WindowListener接口中的所有方法例8-5是鼠標事件和窗口事件的綜合應用實例。窗口中的標簽區(qū)域為鼠標的活動區(qū)域,利用MouseListener、MouseMotionListener對鼠標狀態(tài)進行監(jiān)聽,并把鼠標當前狀態(tài)顯示在下方的文本框內。同時,利用WindowListener對當前窗口的狀態(tài)進行監(jiān)聽,當窗口被激活時,文本框顯示響應提示信息。程序運行效果如圖8-10所示。圖8-10鼠標事件和窗口事件示例例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("鼠標活動區(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任務實施
在第7章的例7-7中沒有編寫對界面組件的事件處理的程序,因此點擊按鈕無任何反應。根據本章8.1節(jié)登錄模塊的事件處理預覽中的介紹,登錄模塊中主要涉及的為鼠標點擊按鈕所觸發(fā)的動作事件ActionEvent。本節(jié)我們將在例7-7的基礎上將事件處理代碼補充完整,主要對【登錄】、【注冊】、【取消】三個按鈕添加事件處理代碼。在例7-7中的LoginPanel類中,首先注明所要實現的事件處理的接口,如:
classLoginPanelextendsJPanelimplementsActionListener
并在其構造方法LoginPanel中對三個按鈕注冊動作事件監(jiān)聽器。
loginbtn.addActionListener(this); //登錄按鈕
registerbtn.addActionListener(this); //注冊按鈕
cancelbtn.addActionListener(this); //取消按鈕
相關事件的處理代碼段如例8-6所示。例8-6登錄模塊中的事件處理代碼。
1publicvoidactionPerformed(ActionEvente){
2 if(e.getSource()==l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 卡通插畫黑板教師教育教學模板模板
- 2025年生態(tài)農業(yè)認證五年發(fā)展路徑報告
- 2025年佛山市南海區(qū)獅山加立幼兒園招聘備考題庫及一套完整答案詳解
- 2025年保定華醫(yī)中醫(yī)醫(yī)院招聘15人備考題庫完整參考答案詳解
- 湖南時空信息安全檢測服務有限公司2025年面向社會公開招聘備考題庫附答案詳解
- 松桃群希高級中學2026年招聘高中教師備考題庫(數學物理化學語文英語)及參考答案詳解一套
- 2025年江西省建工集團有限責任公司所屬企業(yè)招聘備考題庫及答案詳解一套
- 2025年城市共享單車補貼政策分析報告
- 2025年成都市泡桐樹中學教師招聘備考題庫完整答案詳解
- 2025年上海舞臺技術研究所(上海文廣演藝劇院管理事務中心)公開招聘工作人員備考題庫及答案詳解1套
- 中國昭通中藥材國際中心項目可行性研究報告
- 2025中國融通資產管理集團有限公司招聘筆試備考試題(230人)附答案解析
- 2026馬年春節(jié)新年年貨節(jié)大集廟會(金馬迎春年貨大集)活動策劃方案
- 心臟搭橋課件
- 2026年安全員之A證考試題庫500道附答案【滿分必刷】
- 2025年廣東省第一次普通高中學業(yè)水平合格性考試(春季高考)思想政治試題(含答案詳解)
- 人工智能行業(yè)-“人工智能+”行動深度解讀與產業(yè)發(fā)展機遇
- 養(yǎng)殖場貸款申請書樣本
- (一診)達州市2026屆高三第一次診斷性測試思想政治試題(含標準答案)
- 購車意向金合同范本
- 2025四川成都東方廣益投資有限公司下屬企業(yè)招聘9人備考題庫及完整答案詳解1套
評論
0/150
提交評論