Microsoft Word - 投影片ch18

Similar documents
Microsoft PowerPoint - 18_Event.pptx

第1章

Microsoft Word - 投影片ch20

untitled

PowerPoint 簡報

<4D F736F F F696E74202D C DB5DA3136D5C25FCAC2BCFEC7FDB6AFB3CCD0F2C9E8BCC62E BBCE6C8DDC4A3CABD5D>

Chapter 9: Objects and Classes

chp8.ppt

Swing-02.pdf


图形用户界面 (GUI) 设计

Microsoft Word - 正文.doc

Microsoft Word - 投影片ch17

Java事件处理模型

Microsoft Word - 投影片ch23

Microsoft Word - 投影片ch11

chp11.ppt

Microsoft Word - 投影片ch21

Microsoft Word - 投影片ch19

Microsoft Word - Java全文.doc

Microsoft Word - 投影片ch15

JavaIO.PDF

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

(Microsoft Word - wes _\246p\246\363\250\317\245\316LED\277O\305\343\245\334\252\254\272A.doc)

Microsoft PowerPoint - C_Structure.ppt

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

java2d-4.PDF

18_GUI

Microsoft PowerPoint ppt

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

CHAPTER VC#

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

Microsoft Word - 投影片ch13

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

Microsoft Word - 正文.doc

图形学 Project 2 要求 任意两个多边形, 求出其相交的区域 使用说明 例 1 第一步, 与 Project 1 画多边形的方法相同, 画一个多边形 ; 第二步, 单击 INTERSECT WITH, 随后画出第二个多边形 ; 第三步, 单击 FILL 进行填充

mvc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

Chapter 9: Objects and Classes

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

ZW1.PDF

The Embedded computing platform

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Microsoft PowerPoint - 11_EventHandle.pptx

chp6.ppt

Photoshop CS3 影像創造力 基礎講堂 8 學習流程 學習重要性 學習難度 必學指令工具 實作應用範例 創造舞台燈光的漸層繪圖 延伸學習 雜訊與半透明漸層 8-1 Photoshop Photoshop 8 136

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

Microsoft PowerPoint - ch6 [相容模式]

Microsoft PowerPoint - ch02

投影片 1

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

Chapter 9: Objects and Classes

(Microsoft Word - wes _\246p\246\363\250\317\245\316watchdog\250\276\244\356\265{\246\241\267\355\276\367.doc)

Microsoft Word - 正文.doc

運算子多載 Operator Overloading

基于JAVA的连连看游戏设计

ContextMenu

Topic

新・解きながら学ぶJava

Learning Java

投影片 1

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

X6-04_How_do_I_write_a_com_port_communicate_program_of_XPAC_tc

javaexample-02.pdf

二 基 本 架 構 Server image portx data porty client Listen Server Listen Port Window Port maintain connect Maintain user s data Sen

Microsoft Word - 投影片ch22

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

Microsoft PowerPoint - 14Threads.ppt

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Microsoft Word - Broker.doc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

利用Java技术编写桌面软件基础

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M

untitled

AutoCAD 用戶如何使用 ArchiCAD

Microsoft PowerPoint - course8.ppt

投影片 1

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

Microsoft Word - 第3章.doc

基于CDIO一体化理念的课程教学大纲设计

Microsoft Word - 01.DOC

图形学 Project 1 要求 多边形区域填充 ( 算法不限 ) 使用说明 例 1 第一步, 鼠标随意在界面中的画布上点击两次, 则两点间连一条直线 ; 第二步, 画第三个顶点时, 自动连结成为三角形 ; 第三步, 按顺序依次点击, 则按点击顺序形成多边形, 每次多边形变化时, 第一个点和最后

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

untitled

untitled

Microsoft Word - 投影片ch12

Microsoft Word - 投影片ch06

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

Microsoft Word - CH14.doc

untitled

投影片 1

電機工程系認可證照清單 /7/1

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

EJB-Programming-4-cn.doc


Microsoft PowerPoint - course2.ppt

Microsoft PowerPoint - VB14.ppt

Transcription:

Java2 JDK5.0 教學手冊第三版洪維恩編著博碩文化出版書號 pg20210 第十八章事件處理 本章學習目標認識 Java 的委派事件模式認識並學習使用各種事件處理類別學習各種物件的事件處理

事件處理 18-2 18.1 委派事件模式 Java 的事件處理是採取 委派事件模式 (delegation event model) 委派事件模式是指當事件發生時, 產生事件的物件會把此一 訊息 轉給 事件傾聽者 (event listener) 處理的方式

事件處理 18-3 下圖說明了 委派事件模式 的運作流程 : 2 按下按鈕,Java 會產生 1 一個 事件的物件 事件傾聽者 A 先向按鈕 btn 註冊 (register) 4 事件傾聽者 A 依據事件的物件的種類把工作指派給事件處理者 按鈕 btn (event source) 事件傾聽者 A (event listener) 事件處理者 A 3 按鈕 (event source) 會把此一 事件的物件 傳遞給事件傾聽者 A 事件傾聽者 B 事件處理者 B 事件傾聽者 C 事件處理者 C

事件處理 18-4 18.1.1 簡單的範例 下圖設計了一個視窗 frm, 內含一個按鈕 btn, 當此按鈕按下時, 視窗的顏色便會從原先的白色變成黃色 : 按鈕 btn 視窗 frm (1) 按下此按鈕 (2) 視窗由白色變成黃色

事件處理 18-5 下面的程式碼不考慮事件的處理 : 01 // app18_1, 簡單的事件處理範例 ( 未加入事件處理 ) 02 import java.awt.*; 03 public class app18_1 extends Frame // 設定 app18_1 類別繼承自 Frame 類 別 04 { 05 static app18_1 frm=new app18_1(); // 建立 app18_1 類別的物件 frm 06 static Button btn=new Button("Click Me"); 07 08 public static void main(string args[]) 09 { 10 frm.setlayout(new FlowLayout()); 11 frm.settitle("action Event"); 12 frm.setsize(200,150); 13 frm.add(btn); 14 frm.setvisible(true); 15 } 16 }

事件處理 18-6 (1) 誰來當傾聽者? 通常偏好讓包含 事件來源者 的物件來擔任 app18_1 中, 按鈕觸發的事件是由 ActionListener 介面來傾聽, 因此要實作的介面是 ActionListener, 所以必須把第 3 行修改成 : public class app18_1 extends Frame implements ActionListener 類別 app18_1 實作 ActionListener 介面 (2) 怎麼註冊? 可用 addactionlistener() method 來達成 : btn.addactionlistener( frm ); 事件來源者 傾聽者

事件處理 18-7 (3) 如何撰寫事件處理的程式碼? 把事件處理程序撰寫在 actionperformed() method 裡 本例的事件處理只是把視窗的底色改成黃色 : public void actionperformed(actionevent e) { frm.setbackground(color.yellow); } // 事件發生的處理動作 // 把視窗的底色改成黃色

事件處理 18-8 (4) 最後的完成工作 重新整理, 可得到下面的程式碼 : 01 // app18_2, 簡單的事件處理範例 ( 已加入事件處理 ) 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_2 extends Frame implements ActionListener 05 { 06 static app18_2 frm=new app18_2(); 07 static Button btn=new Button("Click Me"); 08 09 public static void main(string args[]) 10 { 11 btn.addactionlistener(frm); // 把 frm 向 btn 註冊 12 frm.setlayout(new FlowLayout()); 13 frm.settitle("action Event"); 14 frm.setsize(200,150); 15 frm.add(btn); 16 frm.setvisible(true); 17 } 18 19 public void actionperformed(actionevent e)// 事件發生的處理動作 20 { 21 frm.setbackground(color.yellow); 22 } 23 }

事件處理 18-9 下圖為 app18_2 的執行流程 : 2 按下按鈕,btn 會產生一個 1 ActionEvent 類別的物件 obj frm 先向按鈕 btn 註冊 btn.addactionlistener(frm); 按鈕 btn (event source) 事件傾聽者 frm (event listener) 4 frm 依據 obj 把工作指派給 actionperformed() method 3 按鈕會把 obj 傳遞給 frm 事件處理者 public void actionperformed(actionevent e) e) {{ frm.setbackground(color.yellow); }}

事件處理 18-10 18.1.2 定義內部類別當成傾聽者 下面的範例是自訂一個類別來實作 ActionListener 介面, 再把此類別產生的物件當成傾聽者 : 01 // app18_3, 定義內部類別當成傾聽者 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_3 // 主類別, 注意此類別不用繼承 Frame 類別 05 { 06 static Frame frm=new Frame("Action Event"); 07 static Button btn=new Button("Click Me"); 08 09 public static void main(string args[]) 10 { 11 btn.addactionlistener(new ActLis()); 12 frm.setlayout(new FlowLayout()); 13 frm.setsize(200,150); 14 frm.add(btn); 15 frm.setvisible(true); 16 } 17 // 定義內部類別 ActLis, 並實作 ActionListener 介面 18 static class ActLis implements ActionListener

事件處理 18-11 19 { 20 public void actionperformed(actionevent e) // 事件發生的處理動作 21 { 22 frm.setbackground(color.yellow); 23 } 24 } 25 }

事件處理 18-12 18.2 認識事件處理類別 事件類別的繼承關係如下圖所示 : java.lang.object java.util.eventobject.eventobject java.awt.awtevent.awt.awtevent ActionEvent AdjustmentEvent ComponentEvent ContainerEvent FocusEvent ItemEvent TextEvent InputEvent PaintEvent WindowEvent KeyEvent MouseEvent

事件處理 18-13 事件類別分為兩種 : 1. 語意事件 (semantic events) 2. 低階事件 (low-level events) 語意事件直接繼承自 AWTEvent 類別 低階事件則是繼承自 ComponentEvent 類別

事件處理 18-14 下圖顯示了事件傾聽者之間的繼承關係 : ActionListener AdjustmentListener java.util java.util.eventlistener ComponentListener ContainerListener FocusListener ItemListener KeyListener MouseListener MouseMotionListener TextListener WindowListener

事件處理 18-15 下表為事件類別 事件傾聽者介面與傾聽者介面裡所提供的 method: 表 18.2.1 事件類別 事件傾聽者介面與傾聽者介面裡所提供的 method 事件類別傾聽者介面傾聽者介面所提供的事件處理者 ActionEvent ActionListener actionperformed(actionevent e) AdjustmentEvent AdjustmentListener adjustmentvaluechanged(adjustmentevent e) ItemEvent ItemListener itemstatechanged(itemevent e) KeyEvent KeyListener keytyped(keyevent e) keypressed(keyevent e) keyreleased(keyevent e) MouseEvent MouseListener MouseMotionListener mouseclicked(mouseevent e) mouseentered(mouseevent e) mouseexited(mouseevent e) mousepressed(mouseevent e) mousereleased(mouseevent e) mousedragged(mouseevent e) mousemoved(mouseevent e) TextEvent TextListener textvaluechanged(textevent e)

事件處理 18-16 事件類別傾聽者介面傾聽者介面所提供的事件處理者 WindowEvent WindowListener windowactivated(windowevent e) windowclosed(windowevent e) windowclosing(windowevent e) windowdeactivated(windowevent e) windowdeiconified(windowevent e) windowiconified(windowevent e) windowopened(windowevent e)

事件處理 18-17 下表為 AWT 所提供的物件中, 可能觸發事件類別的對應關係 : 表 18.2.2 AWT 的物件可能產生事件的對應關係表 事件來源者 Button CheckBox 產生事件的類別型態 ActionEvent ActionEvent ItemEvent Component ComponentEvent FocusEvent KeyEvent MouseEvent MenuItem Scrollbar TextArea TextField Window ActionEvent AdjustmentEvent ActionEvent ActionEvent WindowEvent

事件處理 18-18 18.3 使用 ActionEvent 類別 按下按鈕物件時, 便觸發了動作事件 (action event) getmodifiers() method 可取得事件發生時所按下的按鍵 按鍵被按下的常數都定義在 InputEvent 類別裡, 列表如下 : 表 18.3.1 java.awt.event.inputevent 的資料成員 資料成員 說明 static int ALT_DOWN_MASK 用來表示鍵盤上的 ALT 按鍵被按下, 其值為 512 static int CTRL_DOWN_MASK 用來表示鍵盤上的 CTRL 按鍵被按下, 其值為 128 static int SHIFT_DOWN_MASK 用來表示鍵盤上的 SHIFT 按鍵被按下, 其值為 64

事件處理 18-19 app18_4 是 ActionEvent 類別的使用範例 01 // app18_4, 加入可關閉視窗的按鈕 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_4 extends Frame implements ActionListener 05 { 06 static app18_4 frm=new app18_4(); 07 static Button btn1=new Button("Yellow"); 08 static Button btn2=new Button("Green"); 09 static Button btn3=new Button("Exit"); 10 11 public static void main(string args[]) 12 { 13 btn1.addactionlistener(frm); // 把事件傾聽者 frm 向 btn1 註冊 14 btn2.addactionlistener(frm); // 把事件傾聽者 frm 向 btn2 註冊 15 btn3.addactionlistener(frm); // 把事件傾聽者 frm 向 btn3 註冊 16 17 frm.settitle("action Event"); 18 frm.setlayout(new FlowLayout(FlowLayout.CENTER)); 19 frm.setsize(200,150); 20 frm.add(btn1); 21 frm.add(btn2); 22 frm.add(btn3);

事件處理 18-20 23 frm.setvisible(true); 24 } 25 26 public void actionperformed(actionevent e) 27 { 28 Button btn=(button) e.getsource(); // 取得事件來源物件 29 if(btn==btn1) // 如果是按下 btn1 按鈕 30 frm.setbackground(color.yellow); 31 else if(btn==btn2) // 如果是按下 btn2 按鈕 32 frm.setbackground(color.green); 33 else // 如果是按下 btn3 按鈕 34 System.exit(0); 35 } 36 }

事件處理 18-21 18.4 使用 ItemEvent 類別 ItemEvent 類別可以處理選項物件被選取時, 所觸發的選項事件 ItemListener 介面宣告了 itemstatechanged() method: public void itemstatechanged(itemevent e) 當選項物件被選取時, 這個 method 便會被執行

事件處理 18-22 下表為 ItemEvent 類別提供的成員 : 表 18.4.1 ItemEvent 的資料成員與 method 資料成員 static int DESELECTED static int SELECTED 主要功能 代表 Item 物件的狀態沒有被選取 代表 Item 物件的狀態被選取 method Object getitem() int getstatechange() 主要功能 取得觸發事件的 Item 物件 傳回 Item 物件改變的狀態 (DESELECTED 或 SELECTED)

事件處理 18-23 app18_5 是 ItemEvent 使用的範例 : 01 // app18_5, ItemEvent 類別的使用範例 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_5 extends Frame implements ItemListener 05 { 06 static app18_5 frm=new app18_5(); 07 static Checkbox ckb1=new Checkbox("Epson 5900L"); 08 static Checkbox ckb2=new Checkbox("HP LaserJet 4p"); 09 static Label lab=new Label(" Select a printer "); 10 11 public static void main(string args[]) 12 { 13 CheckboxGroup grp=new CheckboxGroup(); 14 frm.setsize(200,150); 15 frm.settitle("item Event"); 16 frm.setlayout(new FlowLayout(FlowLayout.LEFT)); 17 ckb1.setcheckboxgroup(grp); // 將 ckb1 設為單選 18 ckb2.setcheckboxgroup(grp); // 將 ckb2 設為單選 19 lab.setbackground(color.orange); 20 ckb1.additemlistener(frm); // 讓 frm 當成 ckb1 的傾聽者 21 ckb2.additemlistener(frm); // 讓 frm 當成 ckb2 的傾聽者

事件處理 18-24 22 frm.add(lab); 23 frm.add(ckb1); 24 frm.add(ckb2); 25 frm.setvisible(true); 26 } 27 // ItemEvent 事件發生時的處理動作 28 public void itemstatechanged(itemevent e) 29 { 30 if(ckb1.getstate()==true) // 如果是 ckb1 被選擇 31 lab.settext(" Epson 5900L"); 32 else if(ckb2.getstate()==true) // 如果是 ckb2 被選擇 33 lab.settext(" HP LaserJet 4p"); 34 } 35 }

事件處理 18-25 18.5 文字事件的處理 --TextEvent 類別 當視窗中的 TextField 或 TextArea 物件裡的文字改變時, 會觸發 文字事件 (text event) app18_6 是 TextEvent 使用的範例 : 01 // app18_6, TextEvent 類別的使用範例 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_6 extends Frame implements TextListener 05 { 06 static app18_6 frm=new app18_6(); 07 static TextArea txa1; 08 static TextArea txa2; 09 10 public static void main(string args[]) 11 { 12 txa1=new TextArea("",6,10,TextArea.SCROLLBARS_NONE); 13 txa2=new TextArea("",6,10,TextArea.SCROLLBARS_NONE); 14 frm.setsize(200,150); 15 frm.settitle("text Event"); 16 frm.setlayout(new FlowLayout(FlowLayout.CENTER));

事件處理 18-26 17 txa1.addtextlistener(frm); // 將 frm 設為 txa1 的傾聽者 18 txa2.seteditable(false); // 將 txa2 設定為不可編輯 19 frm.add(txa1); 20 frm.add(txa2); 21 frm.setvisible(true); 22 } 23 // 當 txa1 物件裡的文字改變時, 執行下列的程式碼 24 public void textvaluechanged(textevent e) 25 { 26 txa2.settext(txa1.gettext()); 27 } 28 } app18_6 的執行結果如下所示

事件處理 18-27 18.6 按鍵事件的處理 --KeyEvent 類別 只要在鍵盤上按下任何鍵, 皆會觸發按鍵事件 下表列出 KeyEvent 類別常用的 method: 表 18.6.1 KeyEvent 的 method method char getkeychar() char getkeycode() public boolean isactionkey() 主要功能 傳回按下的字元 傳回字元碼 判別所按下的按鍵是否為 Action Key, 所謂的 Action Key 是指方向鍵 PgDn 與 PgUp 與 F1~F12 等按鍵

事件處理 18-28 18.6.1 以 KeyListener 介面處理 KeyEvent 事件 KeyListener 介面裡宣告了三個 method, 列表如下 : 表 18.6.2 KeyListener 介面裡宣告的 method KeyListener 介面的 method keypressed(keyevent e) keyreleased(keyevent e) keytyped(keyevent e) 功能說明 按下按鍵事件 放開按鍵事件字元輸入事件, 即按下按鍵與放開按鍵這一整個事件, 但不包括鍵入 Action Key

事件處理 18-29 app18_7 是 KeyEvent 使用的範例 : 01 // app18_7, 以 KeyListener 介面處理 KeyEvent 事件 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_7 extends Frame implements KeyListener 05 { 06 static app18_7 frm=new app18_7(); 07 static TextField txf=new TextField(18); 08 static TextArea txa=new TextArea("",4,19,TextArea.SCROLLBARS_NONE); 09 10 public static void main(string args[]) 11 { 12 frm.setsize(200,150); 13 frm.settitle("key Event"); 14 frm.setlayout(new FlowLayout(FlowLayout.CENTER)); 15 txf.addkeylistener(frm); // 將 frm 設為 txf 的傾聽者 16 txa.seteditable(false); // 將 txa 設為不可編輯 17 frm.add(txf); 18 frm.add(txa); 19 frm.setvisible(true); 20 } 21 // 當 txf 物件觸發 KeyEvent 事件時, 依事件種類執行下列的程式碼

事件處理 18-30 22 public void keypressed(keyevent e) // 當按鍵按下時 23 { 24 txa.settext(""); // 清空 txa 裡的文字 25 txa.append("keypressed() called\n"); 26 } 27 public void keyreleased(keyevent e) // 當按鍵放開時 28 { 29 txa.append("keyreleased() called\n"); 30 } 31 public void keytyped(keyevent e) // 鍵入文字時 32 { 33 txa.append("keytyped() called\n"); 34 } 35 } 執行結果如右圖所示 :

事件處理 18-31 18.6.2 以 KeyAdapter 類別事件處理 KeyEvent 事件 app18_8 是以 KeyAdapter 類別事件處理 KeyEvent 事件的範例 01 // app18_8, 以 KeyAdapter 類別事件處理 KeyEvent 事件 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_8 extends Frame // 不需實作 KeyListener 介面 05 { 06 static app18_8 frm=new app18_8(); 07 static TextField txf=new TextField(18); 08 static TextArea txa=new TextArea("",4,19,TextArea.SCROLLBARS_NONE); 09 public static void main(string args[]) 10 { 11 frm.setsize(200,150); 12 frm.settitle("key Event"); 13 frm.setlayout(new FlowLayout(FlowLayout.CENTER)); 14 txf.addkeylistener(new KeyLis()); 15 txa.seteditable(false); 16 frm.add(txf); 17 frm.add(txa); 18 frm.setvisible(true); 19 } 先產生 KeyLis 類別的物件, 再把它當成是 txf 的事件傾聽者

事件處理 18-32 20 // 定義 KeyLis 為 static 類別, 並繼承自 KeyAdapter 類別 21 static class KeyLis extends KeyAdapter 22 { 23 public void keypressed(keyevent e) 24 { 25 txa.settext(""); // 清空 txa 裡的文字 26 if(e.isactionkey()) // 如果是 Action key 27 txa.append("action key is pressed\n"); 28 else // 如果不是 Action key, 則印出字元 29 txa.append(e.getkeychar()+" is pressed\n"); 30 } 31 } 32 } app18_8 的執行結果如下圖所示 :

事件處理 18-33 18.7 滑鼠事件的處理 --MouseEvent 類別 當滑鼠的按鈕按下 滑鼠指標進入或移出事件來源物件, 或者是移動 拖曳滑鼠等, 皆會觸發滑鼠事件 下表 MouseEvent 類別裡常用的 method: 表 18.7.1 method MouseEvent 的 method 主要功能 Point getpoint() int getx() int gety() 取得滑鼠按鍵按下之點的坐標, 並以 Point 類別型態的物件傳回 取得滑鼠按鍵按下之點的 x 坐標 取得滑鼠按鍵按下之點的 y 坐標

事件處理 18-34 Java 以 MouseListener 和 MouseMotionListener 介面當成滑鼠事件的傾聽者 MouseListener 介面主要是用來傾聽下列 5 項事件的發生 : (1) 接下滑鼠按鈕 ( 包括滑鼠左鍵或右鍵 ) (2) 滑鼠的指標移到事件的來源物件 ( 如按鈕 ) 的上方 (3) 滑鼠的指標從事件的來源物件 ( 如按鈕 ) 的上方移出 (4) 按下滑鼠的任一個按鍵 (5) 放開滑鼠被按下的按鍵

事件處理 18-35 下表為 MouseListener 介面裡宣告的 method: 表 18.7.2 MouseListener 介面的 method mouseclicked(mouseevent e) MouseListener 介面裡宣告的 method mouseentered(mouseevent e) mouseexited(mouseevent e) mousepressed(mouseevent e) mousereleased(mouseevent e) 功能說明 在事件來源物件的上方按一下滑鼠按鍵 ( 此動作包括按下與放開兩個程序 ) 滑鼠的指標進入事件的來源物件 滑鼠的指標移出事件的來源物件 按下滑鼠的任一個按鍵 放開滑鼠被按下的按鍵

事件處理 18-36 MouseMotionListener 介面則是用來傾聽下列 2 個事件的發生 : (1) 當滑鼠在事件的來源物件上方移動 (move) (2) 當滑鼠在事件的來源物件上方拖曳 (drag) MouseMotionListener 介面裡也宣告了兩個 method, 列表如下 : 表 18.7.3 MouseMotionListener 介面裡宣告的 method MouseMotionListener 介面的 method 功能說明 mousedragged(mouseevent e) 當滑鼠在事件的來源物件上方拖曳 mousemoved(mouseevent e) 當滑鼠在事件的來源物件上方移動

事件處理 18-37 18.7.1 以 MouseListener 介面處理 MouseEvent 事件 app18_9 是以 MouseListener 介面處理 MouseEvent 事件的範例 : 01 // app18_9, 以 MouseListener 介面處理 MouseEvent 事件 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_9 extends Frame implements MouseListener 05 { 06 static app18_9 frm=new app18_9(); 07 static Button btn=new Button(" Click Me!! "); 08 static TextArea txa=new TextArea("",2,5,TextArea.SCROLLBARS_NONE); 09 10 public static void main(string args[]) 11 { 12 BorderLayout br=new BorderLayout(2,5); 13 frm.setsize(200,150); 14 frm.settitle("mouse Event"); 15 frm.setlayout(br); 16 btn.addmouselistener(frm); // 設定 frm 為 btn 的傾聽者 17 txa.seteditable(false); 18 frm.add(btn,br.west); 19 frm.add(txa,br.center);

事件處理 18-38 20 frm.setvisible(true); 21 } 22 23 public void mouseentered(mouseevent e)// 滑鼠的指標進入 btn 上方 24 { 25 txa.settext("mouse entered\n"); 26 } 27 public void mouseclicked(mouseevent e) // 按下並放開滑鼠按鈕 28 { 29 txa.append("mouse clicked\n"); 30 } 31 public void mouseexited(mouseevent e) // 滑鼠的指標移開 btn 上方 32 { 33 txa.append("mouse exited\n"); 34 } 35 public void mousepressed(mouseevent e) // 按下滑鼠按鈕 36 { 37 txa.append("mouse pressed\n"); 38 } 39 public void mousereleased(mouseevent e) // 放開滑鼠按鈕 40 { 41 txa.append("mouse released\n"); 42 } 43 }

app18_9 的執行結果如下所示 : 事件處理 18-39

事件處理 18-40 18.7.2 以 MouseMotionListener 介面處理 MouseEvent 事件 app18_10 是 MouseMotionListener 介面使用的範例 01 // app18_10, 以 MouseMotionListener 介面處理 MouseEvent 事件 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_10 extends Frame implements MouseMotionListener 05 { 06 static app18_10 frm=new app18_10(); 07 static Label labx=new Label(); 08 static Label laby=new Label(); 09 static Label lab=new Label(); 10 public static void main(string agrs[]) 11 { 12 frm.setlayout(null); 13 frm.addmousemotionlistener(frm); // 設定 frm 為事件的傾聽者 14 labx.setbounds(40,40,40,20); 15 laby.setbounds(100,40,40,20); 16 lab.setbounds(40,80,100,40); 17 frm.setsize(200,150); 18 frm.settitle("mouse Event"); 19 frm.add(labx); 20 frm.add(laby); 21 frm.add(lab);

事件處理 18-41 22 frm.setvisible(true); 23 } 24 public void mousemoved(mouseevent e) // 當滑鼠移動時 25 { 26 labx.settext("x="+e.getx()); // 顯示 x 座標 27 laby.settext("y="+e.gety()); // 顯示 y 座標 28 lab.settext("mouse Moved!!"); // 顯示 "Mouse Moved!!" 字串 29 } 30 public void mousedragged(mouseevent e) // 當滑鼠拖曳時 31 { 32 labx.settext("x="+e.getx()); // 顯示 x 座標 33 laby.settext("y="+e.gety()); // 顯示 y 座標 34 lab.settext("mouse Dragged!!"); // 顯示 "Mouse Dragged!!" 字串 35 } 36 } 當滑鼠拖曳或移動時, 此處便會顯示出滑鼠指標的座標

事件處理 18-42 18.7.3 以 MouseAdapter 類別處理 MouseEvent 事件 app18_11 是以 MouseAdapter 類別事件處理 MouseEvent 事件的範例 01 // app18_11, 以 MouseAdapter 類別事件處理 MouseEvent 事件 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_11 extends Frame 05 { 06 static app18_11 frm=new app18_11(); 07 static Button btn=new Button(" Click Me!! "); 08 static TextArea txa=new TextArea("",2,5,TextArea.SCROLLBARS_NONE); 09 static MouseLis mlis=new MouseLis(); // 建立 MouseLis 類別的物件 10 public static void main(string args[]) 11 { 12 BorderLayout br=new BorderLayout(2,5); 13 frm.setsize(200,150); 14 frm.settitle("mouse Event"); 15 frm.setlayout(br); 16 btn.addmouselistener(mlis); // 以 mlis 物件做為 btn 的傾聽者 17 txa.seteditable(false); 18 frm.add(btn,br.west); 19 frm.add(txa,br.center); 20 frm.setvisible(true);

21 } 22 // 定義 MouseLis 為 static 類別, 並繼承自 MouseAdapter 類別 23 static class MouseLis extends MouseAdapter 24 { 25 public void mouseclicked(mouseevent e) 26 { 27 int x=e.getx(); // 取得 x 座標 28 int y=e.gety(); // 取得 y 座標 29 txa.append("clicked at ("+x+","+y+")\n"); 30 } 31 } 32 } 事件處理 18-43

事件處理 18-44 18.8 視窗事件的處理 --WindowEvent 類別 視窗的建立 縮小至工具列, 或者是關閉等皆會觸發視窗事件 下表列出了 WindowEvent 類別的 method: 表 18.8.1 WindowEvent 的 method method Window getwindow() String paramstring() 主要功能 取得觸發事件的視窗 取得觸發事件之視窗的引數

事件處理 18-45 WindowEvent 事件的傾聽者是 WindowListener 介面, 下表為該介面裡宣告的 method: 表 18.8.2 WindowListener 介面裡宣告的 method WindowListener 介面的 method windowactivated(windowevent e) windowclosed(windowevent e) windowclosing(windowevent e) windowdeactivated(windowevent e) windowdeiconified(windowevent e) windowiconified(windowevent e) windowopened(windowevent e) 事件說明 視窗由 非作用中視窗 變成 作用中視窗 視窗已被關閉 使用者企圖關閉視窗時 此事件是發生在按下視窗關閉鈕時, 因此通常會利用這個時機讓使用者確定是否要關閉 視窗由 作用中視窗 變成 非作用中視窗 視窗由最小化狀態變成一般狀態 視窗由一般狀態變成最小化狀態 視窗開啟時

事件處理 18-46 app18_12 是以 WindowAdapter 類別來處理視窗事件的範例 01 // app18_12, WindowAdapter 類別來處理視窗事件 02 import java.awt.*; 03 import java.awt.event.*; 04 public class app18_12 extends Frame 05 { 06 static app18_12 frm=new app18_12(); 07 static WinLis wlis=new WinLis(); // 產生 WinLis 類別的物件 wlis 08 09 public static void main(string args[]) 10 { 11 frm.setsize(200,150); 12 frm.settitle("window Event"); 13 frm.addwindowlistener(wlis); // 設定 wlis 為 frm 的事件傾聽者 14 frm.setvisible(true); 15 } 16 // 定義 WinLis 為 static, 並繼承自 WindowAdapter 類別 17 static class WinLis extends WindowAdapter 18 { 19 public void windowclosing(windowevent e) // 按下視窗關閉鈕 20 { 21 System.out.println("windowClosing() called"); 22 System.out.println("Closing window..."); 23 frm.dispose(); // 關閉視窗並釋放資源 24 System.out.println("window closed...");

事件處理 18-47 25 } 26 public void windowclosed(windowevent e) // 關閉視窗 27 { 28 System.out.println("windowClosed() called"); 29 } 30 public void windowdeactivated(windowevent e) // 變成非作用中視窗 31 { 32 System.out.println("windowDeactivated() called"); 33 } 34 public void windowactivated(windowevent e) // 變成作用中視窗 35 { 36 System.out.println("windowActivated() called"); 37 } 38 public void windowdeiconified(windowevent e) // 視窗還原 39 { 40 System.out.println("windowDeiconified() called"); 41 } 42 public void windowiconified(windowevent e) // 視窗最小化 43 { 44 System.out.println("windowIconified() called"); 45 } 46 public void windowopened(windowevent e) // 開啟視窗 47 { 48 System.out.println("windowOpened() called"); 49 } 50 } 51 }

事件處理 18-48 執行結果會因觸發視窗事件的不同而定 : /* app18_12 OUTPUT------- windowactivated() called windowopened() called windowiconified() called windowdeactivated() called windowactivated() called windowdeiconified() called windowactivated() called windowclosing() called Closing window... window closed... windowclosed() called -------------------------*/

事件處理 18-49