国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

剖析事件監聽和匿名類

2019-11-18 14:46:53
字體:
來源:轉載
供稿:網友

  前言 在java程序設計中,通常合理的增加一個類或接口可以簡化編碼,獲得可讀性強,結構明晰的的代碼。這一點在Java的事件監聽機制上獲得了體現。本文以JR Client用戶治理界面的部分功能實現為例,闡述如何自定義一個監聽并實現它。

何時需要監聽
在UI設計中,假如一個類中組件的事件(通常為用戶在界面上觸發的事件)與另一個類中的容器或組件相關,這時可以使用監聽。前者是監聽處理類,后者是監聽實現類,另外還需要定義監聽接口。

如何實現監聽
1. 定義監聽接口
添加觸發事件的方法。假如有多個方法,宜再增加一個Adapter抽象類繼續該接口。使用時可以用Adapter類替代接口以減少接口方法的實現。接口例子如下:
/**
* @author efly
* @version 1.0.0,12/17/02
*/
public interface EUserNodeListener {

/**
* 觸發用戶節點名稱改變
*/
public void fireNodeNameChanged(String name);
}

2. 監聽處理類
從編碼的角度看,監聽實現類是PRodUCer,監聽處理類是Consumer;然而從時間處理的角度看,這個過程正好相反:事件是從監聽處理類“流”到監聽實現類。
讓我們看看監聽處理類是如何消費的。首先它定義注冊監聽的方法供監聽實現類調用:
private EUserNodeListener eUserNodeHandler;
public void addEUserNodeListener(EUserNodeListener nodeListener) {
eUserNodeHandler = nodeListener;
}
這個消費者不管監聽者是誰,是哪兒生產的。拿來就用??拿來主義:
name_t.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
eUserNodeHandler.fireNodeNameChanged(name_t.getText());
}
});

3. 監聽實現類
監聽實現很輕易,歸功于Java的匿名類機制。匿名類是內部類的一種。監聽實現類實現了監聽接口:
eUserComp.addEUserNodeListener(new EUserNodeListener() {
public void fireNodeNameChanged(String name) {
org[0].setText(name);
}
});
4. 剖析事件流
從事件的流向看,監聽處理類是事件生產者,監聽實現類是事件消費者。結合UI分析一下事件是如何傳遞的。



治理員在用戶治理界面上選擇/增加一個用戶,相應的用戶信息界面在樹右邊的面板上顯示。
姓名的文本框為文本改變的事件處理者,它是監聽處理類中定義的成員變量。當文本改變時,觸發監聽事件。而在監聽實現類中已經向監聽處理類注冊了監聽,事件即傳遞到監聽實現類的匿名類。匿名類調用觸發事件的方法??樹組件中被選擇的用戶被改變節點名稱為用戶名稱,至此完成了整個事件的傳遞。

不使用監聽的實現

不使用監聽同樣可以實現上述的事件傳遞。監聽的實現(不是全部的實現類)向監聽處理類注冊監聽實際上是把自己作為了監聽處理類的匿名成員??是匿名類給它蒙上了神秘的棉紗。可以通過向監聽處理類注冊完整的實現類來完成相同的事件傳遞機制。在這里,我們改變稱謂(不使用監聽一詞),即UI左邊的Tree結構所代表的是class A,上文中的監聽實現類;UI右邊的Composite所代表的是class B,上文中的監聽實現類。實現如下:
class A{

}
class B{
private A a;
B(A a){
this.a=a;
}

name_t.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
a.getTree().getSelection()[0].setText(name_t.getText());
}
});

}

結束語 在本例中,作者使用的是監聽的實現方式。監聽可以減少代碼的編寫量,并使得程序結構清楚。在多數場合,使用監聽更合理。在本例中使用了很多局部變量,如Tree結構即是一個方法的局部變量。倘若不使用監聽的匿名類實現,使用非監聽后者的方式不易于得到局部的Tree變量。

資料
關于JRC Client的源碼下載和教程可瀏覽http://jrc.gro.clinux.org項目主頁。本例中的源碼在JRC0.4.00版本中。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福州市| 乐昌市| 温宿县| 永嘉县| 建平县| 海兴县| 盐池县| 平凉市| 光泽县| 兰州市| 镶黄旗| 栖霞市| 宜昌市| 广水市| 崇文区| 嘉善县| 鸡东县| 中西区| 老河口市| 康平县| 青龙| 宜黄县| 柏乡县| 齐齐哈尔市| 莲花县| 东莞市| 石渠县| 翼城县| 靖江市| 闽清县| 临海市| 辽源市| 荔浦县| 盘锦市| 泽普县| 寻乌县| 黔江区| 乐都县| 定襄县| 酉阳| 视频|