基於事件的隱式調用風格
基本組件:對象或過程,並分類爲以下更小的組件
–過程或函數,充當事件源或事件處理器的角色
–事件
連接件:事件-過程綁定
–過程(事件處理器,事件的接收和處理方) 向特定的
事件進行註冊;
–組件(事件源) 發佈事件;
–當某些事件被髮布(觸發) 時,向其註冊的過程被隱式調用;
–調用的次序是不確定的;
優點
§支持實現交互式系統(用戶輸入/網絡通訊)
§異步執行,不必同步等待執行結果
§對事件的併發處理將提高系統性能;
缺點:
分佈式控制方式使系統的同步、驗證和調試變得異常困難:
–組件放棄了對系統計算的控制,難以控制各模塊之間的處理次序。一個組件觸發一個事件時,不能確定其它組件是否會響應它。而且即使它知道事件註冊了哪些組件的構成,它也不能保證這些過程被調用的順序。
–既然過程的語義必須依賴於被觸發事件的上下文約束,關於正確性的推理則難以保證。
–傳統的基於先驗和後驗條件的驗證變得不可能。
程序:
1.基於事件的隱式調用風格
常用控制組件的事件——按鈕與動作事件(ActionEvent),參見下例。
按鈕與動作事件運行結果
importjava.awt.*;
importjava.awt.event.*; //引入java.awt.event包處理事件
classBtnLabelAction extends Frame implements ActionListener{
//聲明窗口類(BtnLabelAction)並實現動作事件接口(ActionListener)
Labelprompt;
Buttonbtn;
voidCreateWindow(){ //自定義方法
setTitle("MyButton");
prompt =new Label("你好"); //創建標籤對象
btn =new Button("操作"); //創建按鈕對象
setLayout(newFlowLayout()); //佈局設計,用於安排按鈕、標籤的位置
add(prompt); //將標籤放入容器
add(btn); //將按鈕放入容器
btn.addActionListener(this); //將監聽器(窗體對象本身)註冊給按鈕對象
setSize(300,100);
setVisible(true);
}
publicvoid actionPerformed(ActionEvent e){//接口ActionListener的事件處理方法
if(e.getSource()==btn) //判斷動作事件是否是由按鈕btn引發的
if(prompt.getText()=="你好")
prompt.setText("再見");
else
prompt.setText("你好");
}
}
public class BtnTest{
publicstatic void main (String args[]){
BtnLabelActionbla=new BtnLabelAction();
bla.CreateWindow();
}
}