Java Listener 模式

本文详细介绍了Java中回调机制的实现方式,通过MVC框架实例展示了如何使用多态来注册并调用监听器。重点阐述了匿名内部类与接口MouseListener的应用,演示了点击事件触发多个监听器响应的效果。

转载自:http://www.cnblogs.com/steven0lisa/archive/2010/04/17/1714463.html

感觉有收获, 感谢。


Java Listener 模式

每种语言都有自己回调的方法,java也不例外.

Java的回调是采用多态的方式来回调.比如:

 

    
1 interface MouseListener { 2 // 当click方法被调用的时候代表被鼠标点击了. 3   void click(); 4 }

 

 

 

上面是一个接口,里面只有一个方法.先就通过一个例子展示java是如果施展多态的力量了.

 

复制代码
    
1 public class Model { 2 3 // 初始化50个监听器 4   private MouseListener[] listeners = new MouseListener[ 50 ]; 5 // 用于记录当前listeners数组记录到了哪里 6   int index = 0 ; 7 8 public void addListener(MouseListener listener) { 9 // 向这个model中注册一个监听器 10   listeners[index ++ ] = listener; 11 } 12 13 public void clickModel() { 14 // 调用注册进来所有的listener的click方法 15   for ( int i = 0 ; i < index; i ++ ) { 16 listeners[i].click(); 17 } 18 } 19 // 测试model 20   public static void main(String[] args) { 21 Model model = new Model(); 22 // 添加一个匿名内部类,里面实现了click方法. 23   model.addListener( new MouseListener() { 24 25 public void click() { 26 System.out.println( " 我被点击了 " ); 27 } 28 }); 29 // 再添加一个内部类. 30   model.addListener( new MouseListener() { 31 32 public void click() { 33 System.out.println( " 我被点击了 " ); 34 } 35 }); 36 37 // 下面给model一个点击 38   model.clickModel(); 39 } 40 } 41 42 43  
复制代码

 

 

 

以上是java的MVC框架下最精彩的一段代码.下面是model的工作例子:

 

复制代码
    
1 // 测试model 2   public static void main(String[] args) { 3 Model model = new Model(); 4 // 添加一个匿名内部类,里面实现了click方法. 5   model.addListener( new MouseListener() { 6 7 public void click() { 8 System.out.println( " 我被点击了 " ); 9 } 10 }); 11 // 再添加一个内部类. 12 model.addListener( new MouseListener() { 13 14 public void click() { 15 System.out.println( " 我被点击了 " ); 16 } 17 }); 18 19 // 下面给model一个点击,在实际的JDK源代码中,也是这样子去调用Model中的响应方法的. 20 model.clickModel(); 21 } 22
复制代码

 

 

 

我们可以看到,只点击一次model,却可以输出了2次"我被点击了"的信息.这也就是为什么你可以向JButton,JComboBox,JList,JTable等等里面添加任意多的各种listener.当然其中的奥秘仍需要各位读者自己慢慢琢磨.下面是源代码:

 

复制代码
    
1 public class Model { 2 3 // 初始化50个监听器 4 private MouseListener[] listeners = new MouseListener[ 50 ]; 5 // 用于记录当前listeners数组记录到了哪里 6 int index = 0 ; 7 8 public void addListener(MouseListener listener) { 9 // 向这个model中注册一个监听器 10 listeners[index ++ ] = listener; 11 } 12 13 public void clickModel() { 14 // 调用注册进来所有的listener的click方法 15 for ( int i = 0 ; i < index; i ++ ) { 16 listeners[i].click(); 17 } 18 } 19 // 测试model 20 public static void main(String[] args) { 21 Model model = new Model(); 22 // 添加一个匿名内部类,里面实现了click方法. 23 model.addListener( new MouseListener() { 24 25 public void click() { 26 System.out.println( " 我被点击了 " ); 27 } 28 }); 29 // 再添加一个内部类. 30 model.addListener( new MouseListener() { 31 32 public void click() { 33 System.out.println( " 我被点击了 " ); 34 } 35 }); 36 37 // 下面给model一个点击 38 model.clickModel(); 39 } 40 } 41 42 interface MouseListener { 43 // 当click方法被调用的时候代表被鼠标点击了. 44 void click(); 45 } 46
### Java监听器的概念、实现与使用方法 Java中的监听器(Listener)是一种基于观察者模式的设计模式,用于在某个事件发生时通知注册的监听器对象。监听器通常被用来处理用户界面中的事件,例如按钮点击、窗口关闭等[^1]。 #### 1. 监听器的基本概念 在Java中,监听器是一种接口,开发者需要实现这些接口来定义当特定事件发生时的行为。监听器的主要组成部分包括事件源(Event Source)、事件(Event)和监听器(Listener)。事件源是触发事件的对象,事件是描述发生了什么的对象,而监听器则是对事件做出响应的对象[^2]。 #### 2. 监听器的实现 监听器的实现通常涉及以下几个步骤: - 定义一个类实现某个监听器接口。 - 在事件源上注册该监听器。 - 当事件发生时,事件源会调用监听器中相应的方法。 以下是一个简单的示例,展示如何实现一个`ActionListener`来监听按钮点击事件: ```java import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class ListenerExample { public static void main(String[] args) { JFrame frame = new JFrame("Listener Example"); JButton button = new JButton("Click Me"); // 实现 ActionListener 接口 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button clicked!"); } }); frame.add(button); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } ``` 上述代码中,`ActionListener`接口被匿名内部类实现,并且通过`addActionListener`方法注册到按钮上。当按钮被点击时,`actionPerformed`方法会被调用[^3]。 #### 3. 常见的监听器类型 Java提供了多种内置的监听器接口,用于处理不同类型的事件。以下是一些常见的监听器及其用途: - `ActionListener`:用于处理按钮点击等动作事件。 - `MouseListener`:用于处理鼠标相关的事件,例如点击、移动等。 - `KeyListener`:用于处理键盘输入事件。 - `WindowListener`:用于处理窗口相关的事件,例如打开、关闭等。 #### 4. 使用适配器简化监听器实现 对于某些监听器接口,可能需要实现多个方法,即使只关心其中的一个或几个方法。为了解决这个问题,Java提供了适配器类(Adapter),允许开发者只覆盖感兴趣的方法。例如,`MouseAdapter`可以简化`MouseListener`的实现: ```java import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; public class AdapterExample { public static void main(String[] args) { JFrame frame = new JFrame("Adapter Example"); JButton button = new JButton("Hover Over Me"); // 使用 MouseAdapter 简化实现 button.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { System.out.println("Mouse entered the button area."); } @Override public void mouseExited(MouseEvent e) { System.out.println("Mouse exited the button area."); } }); frame.add(button); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } ``` 在上面的例子中,`MouseAdapter`类被用来简化`MouseListener`接口的实现,避免了必须实现所有方法的问题[^4]。 #### 5. 监听器的应用场景 监听器广泛应用于图形用户界面(GUI)编程中,例如Swing和JavaFX框架。此外,在非GUI场景中,监听器也可以用来监控文件变化、网络连接状态等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值