package  com.Demo; 
import java.util.EventListener; 
 
//Title:监听器接口 
public interface DemoListener extends EventListener 
{ 
   public void demoEvent(DemoEvent dm); 
} 
 
 
package  com.Demo; 
import java.util.EventObject; 
//事件处理类,继承了事件基类 
public class DemoEvent extends EventObject 
{ 
private static final long serialVersionUID=-8352051534142982085L; 
private Object obj; 
private String sName; 
public DemoEvent(Object source,String sName) 
{ 
   super(source); 
   obj=source; 
   this.sName=sName; 
} 
public Object getSource() 
{ 
   return obj; 
} 
public void say() 
{ 
   System.out.println("这个是say方法...."); 
} 
public String getName() 
{ 
   return sName; 
} 
} 
 
package  com.Demo; 
import java.util.Enumeration; 
import java.util.Vector; 
/** 
*Title:使用事件的类Description:该类实现了监听器的添加和监听器方法的执行, 
并且实现了由于属性的改变而执行事件 
*Description:在添加、删除、执行监听器的时候都要注意同步问题 
*/ 
public class DemoSource 
{ 
    private Vector<DemoListener> repository =new Vector<DemoListener>(); 
    private DemoListener dl; 
    private String sName=""; 
    public DemoSource() 
    {} 
      //注册监听器,如果这里没有使用Vector而是使用ArrayList那么注意同步问题 
       public void addDemoListener (DemoListener dl) 
         { 
            repository.addElement(dl);//这步要注意同步问题 
         } 
     //如果这里没有使用Vector而是使用ArrayList那么注意同步问题 
       public void notifyDemoEvent(DemoEvent event) 
         { 
              Enumeration<DemoListener> en=repository.elements();//这步要注意同步 
              while(en.hasMoreElements()) 
               { 
                    dl=(DemoListener)en.nexElement(); 
                    dl.demoEvent(event); 
               } 
         } 
    //删除监听器 
      public void removeDemoListener(DemoListener dl) 
        { 
            respository.remove(dl); 
        } 
 
   //设置属性 
      public   void setName(String str1) 
       { 
             boolean bool=false; 
             if(str1==null &&sName!=null) 
             bool=true; 
             else if(str1=null&& sName==null) 
             bool=true; 
             else if(!sName.equals(str1)) 
             bool=true; 
             this.sName=str1; 
             //如果改变执行事件 
             if(bool) 
             notifDemoEvent(new DemoEvent(this.sName)); 
       } 
       public String getName() 
        { 
           return sName; 
        } 
  } 
 
 
/** 
*Title:测试类Description:测试了由于改变属性而引起的事件发生 
*/ 
public class TestDemo implements DemoLister 
{ 
    private DemoSource ds; 
    public TestDemo() 
     { 
        ds=new DemoSource(); 
        ds.addDemoListener(this); 
        System.out.println("添加监听器完毕"); 
        try { 
               Thread.sleep(3000); 
                //改变属性,触发事件 
               ds.setName("改变属性,触发事件"); 
            } 
        catch(Exception e) 
           { 
               e.printStackTrace(); 
           } 
        ds.addDemoListener(this); 
        System.out.println("添加监听器完毕2"); 
        try { 
               Thread.sleep(3000); 
                //改变属性,触发事件 
               ds.setName("改变属性,触发事件2"); 
            } 
        catch(Exception e) 
           { 
               e.printStackTrace(); 
           } 
 
         ds.removeDemoListener(this); 
        System.out.println("添加监听器完毕3"); 
        try { 
               Thread.sleep(3000); 
                //改变属性,触发事件 
               ds.setName("改变属性,触发事件3"); 
            } 
        catch(Exception e) 
           { 
               e.printStackTrace(); 
           } 
     } 
    public static void main(String args[]) 
      { 
          new TestDemo(); 
      } 
    public void demoEvent(DemoEvent dm) 
      { 
         System.out.println("事件处理方法"); 
         System.out.println(dm.getName()); 
         dm.say(); 
      } 
} |