如果你不是用什麼Visual Cafe,Visual Age一類的東東在寫你的Java作業
而是像我一樣寒酸的用JDK配上UltraEdit32 Chinese patch的話
你一定想知道
到底JAVA如何進行事件處理的動作呢?(更現實一點的說,如何處理作業
中的button動作呢?^_^)
以下我先從JDK 1.0的角度來看(因為JDK1.1在這裡作了極大的更動
而可能有很多同學因為BROWSER和COMPILER的關係,只能用1.0的語法
而老師也說用1.0即可,因此我們先說1.0吧!)
首先先來說一說
什麼是事件呢?
事件是從有電腦就必需有的觀念
任何一台最陽春的電腦
也都要有INPUT設備(例如:鍵盤)
而當我們在鍵盤上按了一個鍵
實際上是激發了一個「SYSTEM_KEY_CLICK」事件給電腦……
而有了所謂GUI(Graphic User Interface)後
事件的種類更多也更複雜
如WINDOW_OPEN、WINDOW_MAXIMIZE、CHOICE_SELECT
等等都被我們視為事件
有了事件以後
程式設計者就可以設計相對的處理程式來回應這個事件
那一個事件該如何定義呢?在JDK 1.0裡是用一個Event class
來定義的
一個產生自Event class 的instance
有兩個重要的member variable
一是id,表示這個事件的編號(例如按滑鼠是幾號,滑鼠移動是幾號)
二是target,表示這個事件的作用物件(例如是按鈕還是文字框)
有了這些觀念,我們就可以把系統傳來的事件解讀了……
系統傳送事件的方式是呼叫預訂在Component中的一些function
也就是每個繼承自Component的元件都會有被系統call的可能(所以你得override這些
function)
系統呼叫的函數的順序如下:
boolean handleEvent(Event evt)
boolean action(Event evt,Object arg)
boolean mouseMove(Event evt,int x,int y)
Down
Up
.......
這什麼意思呢?
handleEvent 是最強大的一個函數,所有的事件(系統、滑鼠、鍵盤)都會先傳給它
如果它處理了這個事件就傳回true,
如果傳回false則系統會繼續把這個事件傳給action來做處理(如果action可處理)
同理如果action也不處理(傳false),系統會把它丟給更低階的mouseMove等函數去處理
如果最後沒人處理,
就不管它
簡單來說,事件可處理的範圍如下:
系統(如使用者按了browser的reload鍵) 鍵盤 滑鼠
handleEvent * * *
action * *
mouseMove *
keyDown *
所以假如今天我們要寫一個讓使用者click button的程式
我們可以在handleEvent裡作處理,也可以在action裡處理,也可以在mouseUp裡處理
以下是一個簡單的在handleEvent裡處理的例子,大家可以看看
有問題再問:
public class ShowHello extends Applet{
private Button HELLO=new Button("Hello");
public void init(){
add(HELLO); //表示把這個按鈕加入容器中
}
public boolean handleEvent(Event evt){
if (evt.target instanceof Button){
//上一行表示
//如果事件發生在Button(當然是click嘍!)
if ("Hello".equals(evt.arg)){
//對Button來說,evt.arg的內容是一個表標題的字串
//故可以此來判斷所按的按鈕
(getGraphics()).drawStrint("Hello,100,100);
return true;//已處理
}
}
return false;
}
}
--
陷入難過的時候
你就擁有了讓自己更快樂的空間……
感覺失意的時候
你就掌握了讓自己得意起來的權利……
--
※ 發信站: 批踢踢實業坊(ptt.m8.ntu.edu.tw)
◆ From: ntucsx.csie.ntu