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