在使用swing编程的时候经常都会用到JButton这个组件,使用Button组件的时候经常都有这样的代码:
JButton btn = new JButton(); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //此处做事件处理 } });
老师上课的时候都会教到,说按钮一点击,就会执行actionPerformed方法里面的代码,没错,就是会执行actionPerformed里面的代码,现在的问题是,为啥它会执行actionPerformed方法里面的代码呢?带着这个问题,我们先来了解一下什么叫事件监听。
事件监听:打个比喻就是“守株待兔”,在某个地方等着某个东西,当等到某个东西之后就去做某件事("守株待兔"里面农夫要是等到兔子来了,那肯定得是抓回去煮着吃了)。
在Java中,有一种事件监听机制,其实就是sun封装了一些类,这些类有他们自己的监听思想,我们如果要使用,就继承或拓展他们这些类,从而实现使用事件监听机制的行为。
Java中的事件机制中有3种角色
1,event object:就是具体的事件(事件)
2,event source:就是事件产生的地方(事件源)
3,event listener:就是对事件产生之后应该干什么(监听者)
打个比喻,我们描述一个事情,如果发生xxx事情,就去干xxx事情,守株待兔的故事就是农夫要是等到兔子,就拿回去煮着吃了。
在事件监听中,我们可以这样描述如果发生event object事件,就去干event listener方法里面的事情这里会加上事件产生的地方event source,就是只定在哪或者在什么情况下出现事件才去干某件事情,比如说要是山洞中出现兔子,兔子又没撞树桩,那农夫肯定不能拿着兔子回去煮着吃了。唯一能够让农夫拿回去煮着吃的前提是那兔子自己撞树桩了。
在JDK中,sun提供的event包,位置在java.util.EventListener, 所有的事件监听器都拓展了这个接口,例如ActionListener
public interface ActionListener extends EventListener { /** * Invoked when an action occurs. */ public void actionPerformed(ActionEvent e); }
其实EventListener也只是一个标志接口而已
/** * A tagging interface that all event listener interfaces must extend. * @since JDK1.1 */ public interface EventListener { }
每个时间类都有相关联的监听器接口,事件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用来进行的。
且先不说JButton的ActionLister怎么实现,我们先来一个自定义事件监听,具体需求描述是:
让自己的程序产生一个事件,但不是用鼠标,键盘之类的输入设备进行(也就是JDK中没有实现的事件监听)。例如写一个程序,这个程序是一旦受到邮件,就对邮件进行相关处理,对于“收到邮件”,这个事件,JDK是没有定义的,我们可以自己去定义它,这就是我们的自定义事件。下面的问题就是:如何自定义事件?
我们上面说到事件的参与者有3个(事件,事件源,事件监听者),所以我们要做的就是定义这3个角色。
1,定义事件,必要条件,必须继承java.util.EventObject
import java.util.EventObject; public class MailEvent extends EventObject{ Object obj; public MailEvent(Object source) { super(source); obj = source; } /** * */ private static final long serialVersionUID = -5529585059881850545L; @Override public Object getSource() { return obj; } }
2,定义监听接口
import java.util.EventListener; public interface MailListener extends EventListener{ //此方法定义接收到MailEvent事件之后应该怎么办 public void doEvent(MailEvent event); }
3,定义事件源
import java.util.Enumeration; import java.util.Vector; public class MailSource { private Vector ve = new Vector(); MailListener mailListener; public void addMailListener(MailListener listener){ ve.addElement(listener); } public void notifyMailEvent(){ Enumeration en = ve.elements(); while(en.hasMoreElements()){ mailListener = (MailListener)en.nextElement(); mailListener.doEvent(new MailEvent(this)); } } }
4,测试
public class TestListener { public static void main(String[] args) { MailSource ms = new MailSource(); ms.addMailListener(new MailListener() { @Override public void doEvent(MailEvent event) { System.out.println("doEvent"); } }); ms.notifyMailEvent(); } }
输出:
doEvent
至此,我们已经会使用自定义事件监听,可以适用很多场合,例如我自己写的线程抛出异常后自动重启
文章在:
http://sziitjiang.iteye.com/blog/1697053
其实也可以使用事件监听来实现,因为事件监听原理也是使用观察者模式,希望对你有帮助!
相关推荐
在实际开发中,观察者模式广泛应用于各种事件处理,例如GUI组件的事件监听、发布-订阅系统、数据变更通知等场景。通过使用观察者模式,开发者可以构建更加模块化、易于维护的系统,提高代码的可重用性和可扩展性。
Java事件处理模型主要基于观察者模式(Observer Pattern)。在这个模型中,事件源(Event Source)负责触发事件,而监听器则负责响应这些事件。事件通常继承自`java.util.EventObject`类,这个基类包含了事件的一些...
在实际应用中,监听器经常与其他设计模式结合使用,如观察者模式(Observer),提供更灵活的事件处理方式。通过熟练掌握Java监听器机制,开发者可以创建更加响应用户输入的、交互性强的应用程序。 在提供的压缩包...
通过这种方式,我们模拟了AWT中Button的事件触发机制,展示了观察者模式如何工作。每个监听器(MyActionListener1和MyActionListener2)都是Button状态变化的观察者,当Button的状态(被点击)发生变化时,它们都会...
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态变化时会通知所有观察者,使它们能够自动更新自己。这种模式的主要角色包括:主题(Subject)、抽象观察者...
其次,对于自定义控件间的数据传递,可以使用事件触发或者观察者模式。一个控件触发一个事件,携带需要传递的数据,另一个控件作为事件监听者,接收到数据后进行相应的处理。这种方式保持了控件之间的松耦合。 最后...
而在观察者模式中,登录成功后,我们发布一个“loginsuccess”事件,让感兴趣的组件(如header和footer)监听这个事件并做出响应: ```javascript login.listen('loginsuccess', function(data) { header.setInfo...
Java中的事件模型基于观察者模式,即一个对象(事件源)发生特定事件时,会通知注册在其上的其他对象(监听器)。这种设计模式促进了代码的解耦,增强了程序的灵活性。 2. **AWT和Swing监听器**: 在Java GUI编程...
这个项目可能通过观察者模式或者KVO(Key-Value Observing)来监听按钮的状态变化,然后根据新的状态更新文字颜色。另一种可能的方法是重写UIControl的sendAction(_:to:for:)方法,以便在按钮事件发生时自定义颜色...
Java中的事件模型基于观察者模式,其中事件源是被观察的对象,事件监听器是观察者。当事件源发生事件时,它会通知所有注册的监听器。在Java AWT和Swing库中,提供了丰富的组件和事件类型,如ActionEvent、MouseEvent...
首先,Java事件处理基于Observer模式,即观察者模式。在这种模式下,事件源(通常是GUI组件,如按钮、文本框等)是被观察的对象,当它们的状态发生改变时,会触发事件。而事件监听器则是观察者,注册到事件源上,...
事件处理在Java中主要通过观察者模式实现,通常包含三个主要组成部分:事件源(Event Source)、事件对象(Event Object)和事件监听器(Event Listener)。事件源是触发事件的对象,例如按钮或文本框;事件对象包含...
Java事件模型主要基于观察者模式(Observer Pattern),在这个模型中,事件源(通常是GUI组件)是被观察的对象,而事件监听器则是观察者。当事件源发生特定事件时,会通知注册的监听器,调用监听器中的相应方法。...
/* 设置观察者的距离,产生立体感 */ } .button:hover { transform: rotateY(180deg); /* 鼠标悬停时,按钮沿Y轴翻转180度 */ transition: all 0.5s ease; /* 动画过渡时间为0.5秒,平滑进行 */ } ``` HTML部分...
// 假设我们有一个观察者模式的数据模型 MyDataModel dataModel = new MyDataModel(); dataModel.addDataChangeListener(new DataChangeListener() { @Override public void onDataChanged(String newText) { ...
首先,Java中的事件处理基于观察者模式(Observer Pattern),它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在GUI中,事件源(如按钮)会生成事件,...
Java事件处理基于观察者模式(Observer Pattern),其中事件源(如按钮或菜单)是被观察的对象,而事件监听器是观察者,负责处理由事件源触发的事件。Java AWT(Abstract Window Toolkit)和Swing库提供了丰富的组件...
事件处理模式基于观察者模式,它允许对象监听其他对象的状态变化并作出反应。在这个模式中,"消息"(通常是一个函数)负责传播状态变化的通知,而"事件代理"(通常是对象的一个方法)接收这些通知并执行相应操作。...
Java的事件模型基于观察者模式,即事件源(如按钮)和事件监听器(监听并响应事件的对象)之间存在一对多的关系。 1. **事件源(Event Source)**:产生事件的对象,如JButton、JTextField等。在这些例子中,按钮...
首先,EXTJS的事件机制基于观察者模式,即事件发布者(Publisher)发出事件,而事件订阅者(Subscriber)监听并响应这些事件。EventManager.js就是实现这一模式的关键,它提供了注册、触发和解绑事件的接口。 1. **...