`

Button 按钮事件监听-又说观察者模式

 
阅读更多

在使用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

其实也可以使用事件监听来实现,因为事件监听原理也是使用观察者模式,希望对你有帮助!

 

分享到:
评论

相关推荐

    9.观察者模式.doc

    在实际开发中,观察者模式广泛应用于各种事件处理,例如GUI组件的事件监听、发布-订阅系统、数据变更通知等场景。通过使用观察者模式,开发者可以构建更加模块化、易于维护的系统,提高代码的可重用性和可扩展性。

    java事件和监听的区别

    Java事件处理模型主要基于观察者模式(Observer Pattern)。在这个模型中,事件源(Event Source)负责触发事件,而监听器则负责响应这些事件。事件通常继承自`java.util.EventObject`类,这个基类包含了事件的一些...

    java一个监听器的例子

    在实际应用中,监听器经常与其他设计模式结合使用,如观察者模式(Observer),提供更灵活的事件处理方式。通过熟练掌握Java监听器机制,开发者可以创建更加响应用户输入的、交互性强的应用程序。 在提供的压缩包...

    Java观察者模式-模拟Awt Button

    通过这种方式,我们模拟了AWT中Button的事件触发机制,展示了观察者模式如何工作。每个监听器(MyActionListener1和MyActionListener2)都是Button状态变化的观察者,当Button的状态(被点击)发生变化时,它们都会...

    如何做到 User control 互動-觀察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态变化时会通知所有观察者,使它们能够自动更新自己。这种模式的主要角色包括:主题(Subject)、抽象观察者...

    Button添加事件委托问题

    其次,对于自定义控件间的数据传递,可以使用事件触发或者观察者模式。一个控件触发一个事件,携带需要传递的数据,另一个控件作为事件监听者,接收到数据后进行相应的处理。这种方式保持了控件之间的松耦合。 最后...

    JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例

    而在观察者模式中,登录成功后,我们发布一个“loginsuccess”事件,让感兴趣的组件(如header和footer)监听这个事件并做出响应: ```javascript login.listen('loginsuccess', function(data) { header.setInfo...

    监听器.zip

    Java中的事件模型基于观察者模式,即一个对象(事件源)发生特定事件时,会通知注册在其上的其他对象(监听器)。这种设计模式促进了代码的解耦,增强了程序的灵活性。 2. **AWT和Swing监听器**: 在Java GUI编程...

    ios-能够跟随button变化字体颜色button.zip

    这个项目可能通过观察者模式或者KVO(Key-Value Observing)来监听按钮的状态变化,然后根据新的状态更新文字颜色。另一种可能的方法是重写UIControl的sendAction(_:to:for:)方法,以便在按钮事件发生时自定义颜色...

    事件处理编程范例

    Java中的事件模型基于观察者模式,其中事件源是被观察的对象,事件监听器是观察者。当事件源发生事件时,它会通知所有注册的监听器。在Java AWT和Swing库中,提供了丰富的组件和事件类型,如ActionEvent、MouseEvent...

    JAVA事件处理指南

    首先,Java事件处理基于Observer模式,即观察者模式。在这种模式下,事件源(通常是GUI组件,如按钮、文本框等)是被观察的对象,当它们的状态发生改变时,会触发事件。而事件监听器则是观察者,注册到事件源上,...

    事件编程小结

    事件处理在Java中主要通过观察者模式实现,通常包含三个主要组成部分:事件源(Event Source)、事件对象(Event Object)和事件监听器(Event Listener)。事件源是触发事件的对象,例如按钮或文本框;事件对象包含...

    java事件传递技术

    Java事件模型主要基于观察者模式(Observer Pattern),在这个模型中,事件源(通常是GUI组件)是被观察的对象,而事件监听器则是观察者。当事件源发生特定事件时,会通知注册的监听器,调用监听器中的相应方法。...

    javascript经典特效---立体变换的按钮.rar

    /* 设置观察者的距离,产生立体感 */ } .button:hover { transform: rotateY(180deg); /* 鼠标悬停时,按钮沿Y轴翻转180度 */ transition: all 0.5s ease; /* 动画过渡时间为0.5秒,平滑进行 */ } ``` HTML部分...

    android demo,navigationBar,导航栏,左边按钮,右边按钮,中间文字的实现

    // 假设我们有一个观察者模式的数据模型 MyDataModel dataModel = new MyDataModel(); dataModel.addDataChangeListener(new DataChangeListener() { @Override public void onDataChanged(String newText) { ...

    java gui捕获事件

    首先,Java中的事件处理基于观察者模式(Observer Pattern),它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在GUI中,事件源(如按钮)会生成事件,...

    Java事件处理机制教学方法探讨.zip

    Java事件处理基于观察者模式(Observer Pattern),其中事件源(如按钮或菜单)是被观察的对象,而事件监听器是观察者,负责处理由事件源触发的事件。Java AWT(Abstract Window Toolkit)和Swing库提供了丰富的组件...

    javascript事件模型代码

    事件处理模式基于观察者模式,它允许对象监听其他对象的状态变化并作出反应。在这个模式中,"消息"(通常是一个函数)负责传播状态变化的通知,而"事件代理"(通常是对象的一个方法)接收这些通知并执行相应操作。...

    Java_event_example(No.13).rar_event

    Java的事件模型基于观察者模式,即事件源(如按钮)和事件监听器(监听并响应事件的对象)之间存在一对多的关系。 1. **事件源(Event Source)**:产生事件的对象,如JButton、JTextField等。在这些例子中,按钮...

    Extjs源码之--Ext事件机制/继承关系

    首先,EXTJS的事件机制基于观察者模式,即事件发布者(Publisher)发出事件,而事件订阅者(Subscriber)监听并响应这些事件。EventManager.js就是实现这一模式的关键,它提供了注册、触发和解绑事件的接口。 1. **...

Global site tag (gtag.js) - Google Analytics