java基本事件处理机制解析
作者:Robin_zd
基本事件处理机制分析
一、什么是事件处理机制?
事件处理机制中参与有三种角色:事件源、事件、事件监听者
- 事件源:产生事件的对象/组件
- 事件:事件源的状态发生改变之后的对象,如鼠标操作、键盘操作等
- 事件监听者:负责监听事件的发生并处理事件
二、Action与ActionListener机制分析
Java GUI可以利用ActionListener进行ActionEvent的监听
其步骤如下:
- 事件监听者实现了接口ActionListener的类实例
- 事件源对象能够添加监听器对象并向其发送事件对象
- 当事件发生时,事件源将事件对象发送给添加的监听器
- 监听器对象对事件对象进行处理响应
示例:
//actionlistener可以作为外部类、内部类、匿名类进行监听,本示例使用内部类
//两个监听者对应两个button组件
private class bt1Handler implements ActionListener {
public void actionPerformed(ActionEvent e) {
jTextArea.setText("按钮一点击");
}
}
private class bt2Handler implements ActionListener {
public void actionPerformed(ActionEvent e) {
jTextArea.setText("按钮二点击");
}
}
//添加监视器
bt1.addActionListener(bt1Handler);
bt2.addActionListener(bt2Handler);
效果:

三、其他事件处理方式
(1)普通方法调用
它是一种阻塞式调用,例如A类中的方法a要调用B类中的方法b,必须要等待b方法执行完毕才能执行b方法之后的代码,如果b方法执行时间较长,整个过程就被阻塞在了这一步。
(2)回调函数
回调函数的概念十分简单,就是将函数作为另一个函数的参数,java中不允许方法作为参数们只能传入类,然后调用类的方法,分为同步与异步回调函数,下面分别实现:
同步回调:
//示例:我与朋友打电话让他去我家吃饭,朋友同意
//Me类:
public class Me implements callable {
MyFriend friend;
public Me( MyFriend friend){
this.friend=friend;
}
public void callFriend() throws Exception {
System.out.println("开始执行同步回调函数");
System.out.println("去我家吃饭");
friend.answer(this);
System.out.println("开始执行同步回调函数");
}
@Override
//回调函数
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();
}
}
结果:

异步回调:
//与同步回调区别是,回调函数单开一个线程,不影响和Me类等待回调函数执行完成
public void callFriend() throws Exception {
System.out.println("开始执行异步回调函数");
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("异步回调函数执行完成");
}
结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)观察者模式
所谓观察者模式,其实是一种一对多的模式,有一个被观察者以及多个观察者,当被观察者的状态发生变化时,观察者可以收到相应的信息。像我们平时订阅一个微信公众号或者是b站上关注一个up主,当其发布新内容时,你就会得知相应的信息。
示例:
//你关注的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);
}
//实现类
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()+"的新视频来了");
}
}
结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)几种事件处理机制综合比较
以上四种事件处理机制中可以分为两类,普通方法调用为一类,其他三种为第二类:
抽象与解耦:
这三种事件处理方式利用接口将抽象类与实现类的耦合度降低,同时将接口充当调用者与被调用者之间的第三者,通过接口尽可能减少不同类的依赖关系,尽可能增大数据耦合,从而降低耦合程度。
高内聚:
后三钟事件处理方式,将不同主体分开来(如观察者与被观察者),每个实体类专注于自身的职责(即单一原则)。
好处:
“高内聚,低耦合”使得后面三种事件处理方式易于扩展、灵活性高、更易于维护与开发,而普通的函数调用则不具备这些优点。这也是面向接口编程的一大特点。
到此这篇关于java基本事件处理机制解析的文章就介绍到这了,更多相关java事件处理机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
