java基本事件處理機(jī)制解析
基本事件處理機(jī)制分析
一、什么是事件處理機(jī)制?
事件處理機(jī)制中參與有三種角色:事件源、事件、事件監(jiān)聽者
- 事件源:產(chǎn)生事件的對象/組件
- 事件:事件源的狀態(tài)發(fā)生改變之后的對象,如鼠標(biāo)操作、鍵盤操作等
- 事件監(jiān)聽者:負(fù)責(zé)監(jiān)聽事件的發(fā)生并處理事件
二、Action與ActionListener機(jī)制分析
Java GUI可以利用ActionListener進(jìn)行ActionEvent的監(jiān)聽
其步驟如下:
- 事件監(jiān)聽者實(shí)現(xiàn)了接口ActionListener的類實(shí)例
- 事件源對象能夠添加監(jiān)聽器對象并向其發(fā)送事件對象
- 當(dāng)事件發(fā)生時(shí),事件源將事件對象發(fā)送給添加的監(jiān)聽器
- 監(jiān)聽器對象對事件對象進(jìn)行處理響應(yīng)
示例:
//actionlistener可以作為外部類、內(nèi)部類、匿名類進(jìn)行監(jiān)聽,本示例使用內(nèi)部類
//兩個監(jiān)聽者對應(yīng)兩個button組件
private class bt1Handler implements ActionListener {
public void actionPerformed(ActionEvent e) {
jTextArea.setText("按鈕一點(diǎn)擊");
}
}
private class bt2Handler implements ActionListener {
public void actionPerformed(ActionEvent e) {
jTextArea.setText("按鈕二點(diǎn)擊");
}
}
//添加監(jiān)視器
bt1.addActionListener(bt1Handler);
bt2.addActionListener(bt2Handler);
效果:

三、其他事件處理方式
(1)普通方法調(diào)用
它是一種阻塞式調(diào)用,例如A類中的方法a要調(diào)用B類中的方法b,必須要等待b方法執(zhí)行完畢才能執(zhí)行b方法之后的代碼,如果b方法執(zhí)行時(shí)間較長,整個過程就被阻塞在了這一步。
(2)回調(diào)函數(shù)
回調(diào)函數(shù)的概念十分簡單,就是將函數(shù)作為另一個函數(shù)的參數(shù),java中不允許方法作為參數(shù)們只能傳入類,然后調(diào)用類的方法,分為同步與異步回調(diào)函數(shù),下面分別實(shí)現(xiàn):
同步回調(diào):
//示例:我與朋友打電話讓他去我家吃飯,朋友同意
//Me類:
public class Me implements callable {
MyFriend friend;
public Me( MyFriend friend){
this.friend=friend;
}
public void callFriend() throws Exception {
System.out.println("開始執(zhí)行同步回調(diào)函數(shù)");
System.out.println("去我家吃飯");
friend.answer(this);
System.out.println("開始執(zhí)行同步回調(diào)函數(shù)");
}
@Override
//回調(diào)函數(shù)
public void call(){
System.out.println("好好好");
}
}
//MyFriend類:
public class MyFriend {
public void answer( callable callable) throws Exception{
System.out.println("接線中.....");
callable.call();
}
}
//callable接口:
public interface callable {
public void call();
}
//test類:
public class testCallBack {
public static void main(String[] args) throws Exception{
MyFriend friend=new MyFriend();
Me me=new Me(friend);
me.callFriend();
}
}
結(jié)果:

異步回調(diào):
//與同步回調(diào)區(qū)別是,回調(diào)函數(shù)單開一個線程,不影響和Me類等待回調(diào)函數(shù)執(zhí)行完成
public void callFriend() throws Exception {
System.out.println("開始執(zhí)行異步回調(diào)函數(shù)");
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("去我家吃飯");
friend.answer(Me.this);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
System.out.println("異步回調(diào)函數(shù)執(zhí)行完成");
}
結(jié)果:
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-9BFKSZiM-1663237616444)(C:\Users\zdsss\AppData\Roaming\Typora\typora-user-images\image-20220915174027734.png)]](http://img.jbzj.com/file_images/article/202310/202310181003598.png)
(3)觀察者模式
所謂觀察者模式,其實(shí)是一種一對多的模式,有一個被觀察者以及多個觀察者,當(dāng)被觀察者的狀態(tài)發(fā)生變化時(shí),觀察者可以收到相應(yīng)的信息。像我們平時(shí)訂閱一個微信公眾號或者是b站上關(guān)注一個up主,當(dāng)其發(fā)布新內(nèi)容時(shí),你就會得知相應(yīng)的信息。
示例:
//你關(guān)注的up主更新了,并私信通知他的所有粉絲
//觀察者接口
public interface Observer {
public void update(String video);
}
//具體觀察者(粉絲)類
public class Fan implements Observer{
private String name;//粉絲姓名
public Fan(String name){
this.name=name;
}
@Override
public void update(String video){
System.out.println(name+"! "+video);
}
}
//被觀察者接口
public interface UpLoader {
//添加粉絲
void addFan(Fan fan);
//刪除粉絲
void deleteFan(Fan fan);
//通知粉絲
void informFan(String video);
}
//實(shí)現(xiàn)類
public class BilibliUpLoader implements UpLoader{
public String getName() {
return name;
}
private String name;
private List<Fan> fanList=new ArrayList<>();
public BilibliUpLoader(String name){
this.name=name;
}
@Override
public void addFan(Fan fan) {
fanList.add(fan);
}
@Override
public void deleteFan(Fan fan) {
fanList.remove(fan);
}
@Override
public void informFan(String video) {
for(Fan fan:fanList){
fan.update(video);
}
}
}
//測試類
public class test {
public static void main(String[] args) {
BilibliUpLoader bilibliUpLoader=new BilibliUpLoader("Mike");
Fan fan=new Fan("jack");
Fan fan1=new Fan("Bob");
Fan fan2=new Fan("Mary");
Fan fan3=new Fan("Lisa");
bilibliUpLoader.addFan(fan);
bilibliUpLoader.addFan(fan1);
bilibliUpLoader.addFan(fan2);
bilibliUpLoader.addFan(fan3);
bilibliUpLoader.informFan(bilibliUpLoader.getName()+"的新視頻來了");
}
}
結(jié)果:
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-1R25jW6d-1663237616444)(C:\Users\zdsss\AppData\Roaming\Typora\typora-user-images\image-20220915174005365.png)]](http://img.jbzj.com/file_images/article/202310/202310181004009.png)
(4)幾種事件處理機(jī)制綜合比較
以上四種事件處理機(jī)制中可以分為兩類,普通方法調(diào)用為一類,其他三種為第二類:
抽象與解耦:
這三種事件處理方式利用接口將抽象類與實(shí)現(xiàn)類的耦合度降低,同時(shí)將接口充當(dāng)調(diào)用者與被調(diào)用者之間的第三者,通過接口盡可能減少不同類的依賴關(guān)系,盡可能增大數(shù)據(jù)耦合,從而降低耦合程度。
高內(nèi)聚:
后三鐘事件處理方式,將不同主體分開來(如觀察者與被觀察者),每個實(shí)體類專注于自身的職責(zé)(即單一原則)。
好處:
“高內(nèi)聚,低耦合”使得后面三種事件處理方式易于擴(kuò)展、靈活性高、更易于維護(hù)與開發(fā),而普通的函數(shù)調(diào)用則不具備這些優(yōu)點(diǎn)。這也是面向接口編程的一大特點(diǎn)。
到此這篇關(guān)于java基本事件處理機(jī)制解析的文章就介紹到這了,更多相關(guān)java事件處理機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Netty網(wǎng)絡(luò)編程零基礎(chǔ)入門
Netty是一個異步的、基于事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護(hù)、高性能的網(wǎng)絡(luò)服務(wù)器和客戶端,如果你還不了解它的使用,就趕快繼續(xù)往下看吧2022-08-08
實(shí)戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之整合Swagger2到通用模塊
聊聊Arrays.deepToString()和Arrays.toString()的區(qū)別
Struts2實(shí)現(xiàn)生成動態(tài)驗(yàn)證碼并驗(yàn)證實(shí)例代碼
Java9新特性對HTTP2協(xié)議支持與非阻塞HTTP?API

