package com.hexun.sample;
import javax.swing.event.EventListenerList;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
/**
* Java的事件机制/自定义事件.
运行结果:
do something interesting in source here.
listener detects [event]:wintys.event.MyEvent[source=wintys.event.MySource@18158
59] [occur at]:2009-10-11 16:27:49
listener detects [event]:wintys.event.MyEvent[source=wintys.event.MySource@18158
59] [occur at]:2009-10-11 16:27:49
* @version 2009-10-11
* @author 天堂露珠 (wintys@gmail.com)
* @see http://www.blogjava.net/wintys
*/
public class MyEventTest{
public static void main(String[] args){
MySource source = new MySource();
MyListener myListener = new MyListener(){
public void doMyAction(MyEvent e){
System.out.println("listener detects " + e);
}
};
source.addMyListener(myListener);
source.addMyListener(myListener);
source.addMyListener(myListener);
source.removeMyListener(myListener);
source.doSomething();
}
}
/**
* 自定义的事件.
* @version 2009-10-11
* @author 天堂露珠(wintys@gmail.com)
* @see http://www.blogjava.net/wintys
*/
class MyEvent extends java.util.EventObject{
private Date date;//记录事件发生的时间
public MyEvent(Object source , Date date){
super(source);
this.date = date;
}
public String toString(){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dt = df.format(date);
return "[event]:" + super.toString() + " [occur at]:" + dt;
}
}
/**
* 自定义事件监听器接口.
* @version 2009-10-11
* @author 天堂露珠(wintys@gmail.com)
* @see http://www.blogjava.net/wintys
*/
interface MyListener extends java.util.EventListener{
void doMyAction(MyEvent e);
}
/**
* 自定义事件源.
* @version 2009-10-11
* @author 天堂露珠(wintys@gmail.com)
* @see http://www.blogjava.net/wintys
*/
class MySource{
/**
* 保存注册的监听器列表.
* 子类可以使用它保存自己的事件监听器(非MyListener监听器)列表.
*/
protected EventListenerList listenerList = new EventListenerList();
private MyEvent myEvent = null;//fireDoMyAction()使用此变量
/**
* 没有做任何事
*/
public MySource(){
}
/**
* 添加一个MyListener监听器
*/
public void addMyListener(MyListener listener){
listenerList.add(MyListener.class , listener);
}
/**
* 移除一个已注册的MyListener监听器.
* 如果监听器列表中已有相同的监听器listener1、listener2,
* 并且listener1==listener2,
* 那么只移除最近注册的一个监听器。
*/
public void removeMyListener(MyListener listener){
listenerList.remove(MyListener.class , listener);
}
/**
* @return 在此对象上监听的所有MyListener类型的监听器
*/
public MyListener[] getMyListeners(){
return (MyListener[])listenerList.getListeners(MyListener.class);
}
//Winty:Copy directly from javax.swing.event.EventListenerList
/*Notify all listeners that have registered interest for
notification on this event type. The event instance
is lazily created using the parameters passed into
the fire method.
*/
protected void fireDoMyAction() {
// getListenerList() Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==MyListener.class) {
// Lazily create the event:
if (myEvent == null)
myEvent = new MyEvent(this , new Date());
((MyListener)listeners[i+1]).doMyAction(myEvent);
}
}
}
/**
* 做一些事件源应该做的有意义的事,然后通知监听器.
* 这里只是一个示例方法.
* 例如:MySource如果是一个按钮,则doSomething()就可以命名为click(),
* 当用户点击按钮时调用click()方法.
*/
public void doSomething() {
System.out.println("do something interesting here.");
fireDoMyAction();//通知监听器
}
}
http://apps.hi.baidu.com/share/detail/18575799
分享到:
相关推荐
此外,还可以使用`EventListenerList`和`EventObject`类来管理和分发事件,这在实现自定义事件模型时非常有用。 在实际应用中,监听器经常与其他设计模式结合使用,如观察者模式(Observer),提供更灵活的事件处理...
它维护了一个`EventListenerList`,用于存储所有的`PropertyChangeListener`。`firePropertyChange`方法实际上是创建并发布一个`PropertyChangeEvent`,然后遍历监听器列表,调用每个监听器的`propertyChange`方法。...
6. **事件传播和处理**:理解和使用Swing的事件模型,包括事件的冒泡和捕获,以及`EventQueue`和`EventListenerList`,以确保事件处理的正确性。 7. **用户体验**:在设计拖拽功能时,还需要考虑用户体验,例如通过...
通过学习和实践“精通Java Swing程序设计”中的实例,读者可以深入了解Swing的用法,掌握如何创建功能丰富的Java桌面应用。CHM文件提供的详细解释和示例代码,有助于理论与实践相结合,提升编程技能。
- **观察者模式**:在`javax.swing.event.EventListenerList`类中,用于实现事件监听机制。 - **代理模式**:在`java.rmi.Remote`接口中,用于实现远程方法调用。 **3. Java中的单例模式有什么注意事项?** - 在多...
3. EventListenerList:Swing组件中用于存储事件监听器的列表,支持多监听器。 4. KeyListener:监听键盘输入的接口,包括keyPressed(), keyReleased()和keyTyped()方法。 5. MouseListener / MouseMotionListener:...
这个`convert`方法创建了一个新的Bean实例,并遍历Map中的每一对键值,将其转换并设置到Bean的相应属性上。这样,我们就可以将HTTP请求参数轻松地映射到JavaBean对象。 总之,Java反射中的java.beans包提供了一套...