麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

剖析事件監聽和匿名類

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版本中。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 99riav视频一区二区 | 99热久草 | 久久精品亚洲欧美日韩精品中文字幕 | 圆产精品久久久久久久久久久 | 二级大黄大片高清在线视频 | 午夜热门福利 | 日本在线不卡一区二区 | 少妇一级淫片免费看 | 久草视频国产在线 | 插插操 | 伦一区二区三区中文字幕v亚洲 | 国产精品一区二区免费在线观看 | 欧产日产国产精品乱噜噜 | 深夜精品福利 | 日韩一级片免费 | 国产日韩亚洲 | 久久久久9999| 欧美成人一区二区三区电影 | 爱福利视频网 | 欧美一级电影网 | 免费看黄色一级大片 | 本站只有精品 | 草b视频在线观看 | 欧美精品免费一区二区三区 | 失禁高潮抽搐喷水h | 黄色久 | 综合99 | 亚洲日本欧美 | 巨乳毛片 | 国产91九色 | 一夜新娘第三季免费观看 | 国产成人在线看 | 激情网站免费观看 | 成人三级电影网 | 免费观看一级黄色片 | 日本a级一区| 在线成人av观看 | 国产精品久久久久久久久久大牛 | 国产精品片一区二区三区 | 亚洲免费看片网站 | 国产精品一区在线看 |