Module java.desktop

Class EventListenerList

java.lang.Object
javax.swing.event.EventListenerList
所有已实现的接口:
Serializable

public class EventListenerList extends Object implements Serializable
一个保存 EventListeners 列表的类。一个单一实例可以用于保存使用列表的实例的所有监听器(所有类型)。使用 EventListenerList 的类负责提供类型安全的 API(最好符合 JavaBeans 规范)和将事件通知方法分派到列表上适当的 Event Listeners 的方法。这个类提供的主要好处是,在没有监听器的情况下相对便宜,并且提供了事件监听器列表的序列化在一个地方,以及一定程度的 MT 安全性(正确使用时)。使用示例:假设正在定义一个发送 FooEvents 的类,并且希望允许类的用户注册 FooListeners 并在发生 FooEvents 时接收通知。应该将以下内容添加到类定义中:
 EventListenerList listenerList = new EventListenerList();
 FooEvent fooEvent = null;

 public void addFooListener(FooListener l) {
     listenerList.add(FooListener.class, l);
 }

 public void removeFooListener(FooListener l) {
     listenerList.remove(FooListener.class, l);
 }


 // 通知所有已注册对此事件类型感兴趣的监听器。事件实例是使用传递给 fire 方法的参数延迟创建的。

 protected void fireFooXXX() {
     // 保证返回一个非空数组
     Object[] listeners = listenerList.getListenerList();
     // 从后向前处理监听器,通知那些对此事件感兴趣的监听器
     for (int i = listeners.length-2; i>=0; i-=2) {
         if (listeners[i]==FooListener.class) {
             // 延迟创建事件:
             if (fooEvent == null)
                 fooEvent = new FooEvent(this);
             ((FooListener)listeners[i+1]).fooXXX(fooEvent);
         }
     }
 }
 
foo 应该更改为适当的名称,fireFooXxx 应更改为适当的方法名称。每个通知方法应该存在一个 fire 方法,用于 FooListener 接口中的每个通知方法。

警告: 此类的序列化对象将不兼容未来的 Swing 版本。当前的序列化支持适用于短期存储或在运行相同 Swing 版本的应用程序之间的 RMI。从 1.4 开始,已将所有 JavaBeans 的长期存储支持添加到 java.beans 包中。请参阅 XMLEncoder

  • Field Details

    • listenerList

      protected transient volatile Object[] listenerList
      监听器类型 - 监听器对的列表
  • Constructor Details

    • EventListenerList

      public EventListenerList()
      构造一个 EventListenerList
  • Method Details

    • getListenerList

      public Object[] getListenerList()
      将事件监听器列表作为 ListenerType-监听器对的数组传回。请注意,出于性能原因,此实现将实际存储监听器数据的数据结构传回!此方法保证传回一个非空数组,因此在 fire 方法中不需要进行空值检查。如果当前没有监听器,则应返回一个长度为零的 Object 数组。警告!!! 绝对不应对此数组中包含的数据进行任何修改--如果需要进行任何此类操作,应在返回的数组的副本上而不是数组本身上进行操作。
      返回:
      ListenerType-监听器对的数组
    • getListeners

      public <T extends EventListener> T[] getListeners(Class<T> t)
      返回给定类型的所有监听器的数组。
      类型参数:
      T - 要搜索的 EventListener 的类型
      参数:
      t - 要返回的 EventListener 类型
      返回:
      指定类型的所有监听器。
      抛出:
      ClassCastException - 如果提供的类无法分配给 EventListener
      自:
      1.3
    • getListenerCount

      public int getListenerCount()
      返回此监听器列表的所有监听器总数。
      返回:
      所有监听器的整数计数
    • getListenerCount

      public int getListenerCount(Class<?> t)
      返回此监听器列表中指定类型的所有监听器总数。
      参数:
      t - 要计数的监听器类型
      返回:
      类型为 t 的监听器数量
    • add

      public <T extends EventListener> void add(Class<T> t, T l)
      将监听器添加为指定类型的监听器。
      类型参数:
      T - 要添加的 EventListener 的类型
      参数:
      t - 要添加的 EventListener 类型
      l - 要添加的监听器
    • remove

      public <T extends EventListener> void remove(Class<T> t, T l)
      将监听器从指定类型的监听器中移除。
      类型参数:
      T - EventListener 的类型
      参数:
      t - 要移除的监听器类型
      l - 要移除的监听器
    • toString

      public String toString()
      返回 EventListenerList 的字符串表示形式。
      覆盖:
      toString 在类 Object
      返回:
      对象的字符串表示形式。