陳亮

          ChenLiang

          JAVA自定義事件監聽完整例子---sunfruit[轉]

          很多介紹用戶自定義事件都沒有例子,或是例子不全,下面寫了一個完整的例子,并寫入了注釋以便參考,完整的實例源代碼如下:
          package demo;

          import java.util.EventObject;

          /**
          * Title: 事件處理類,繼承了事件基類
          * Description: 
          * Copyright: Copyright (c) 2005
          * Company: cuijiang
          @author not attributable
          @version 1.0
          */

          public class DemoEvent extends EventObject
          {
             
          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 demo;

          import java.util.EventListener;

          /**
          * Title: 監聽器接口
          * Description: 
          * Copyright: Copyright (c) 2005
          * Company: cuijiang
          @author not attributable
          @version 1.0
          */

          public interface DemoListener extends EventListener{
             
          public void demoEvent(DemoEvent dm);
          }



          package demo;
          import java.util.*;

          /**
          * Title: 使用事件的類
          * Description: 該類實現了監聽器的添加和監聽器方法的執行,并且實現了由于屬性的改變而執行事件
          * Description: 在添加、刪除、執行監聽器的時候都要注意同步問題
          * Copyright: Copyright (c) 2005
          * Company: cuijiang
          @author not attributable
          @version 1.0
          */

          public class DemoSource{
             
          private Vector repository = new Vector();
             
          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 
          enum = repository.elements();//這步要注意同步問題
               while(enum.hasMoreElements())
               
          {
                 dl 
          = (DemoListener)enum.nextElement();
                 dl.demoEvent(event);
               }

             }


             
          //刪除監聽器,如果這里沒有使用Vector而是使用ArrayList那么要注意同步問題
             public void removeDemoListener(DemoListener dl)
             
          {
               repository.remove(dl);
          //這步要注意同步問題
             }


             
          /**
              * 設置屬性
              * 
          @param str1 String
              
          */

             
          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) notifyDemoEvent(new DemoEvent(this,sName));
             }


             
          public String getName()
             
          {
               
          return sName;
             }

          }



          package demo;

          import java.lang.Thread;

          /**
          * Title: 測試類
          * Description: 測試了由于改變屬性而引起的事件發生
          * Copyright: Copyright (c) 2005
          * Company: cuijiang
          @author not attributable
          @version 1.0
          */

          public class TestDemo
               
          implements DemoListener {
             
          private DemoSource ds; 

             
          public TestDemo()
             
          {
               ds
          =new DemoSource();
               ds.addDemoListener(
          this);
               System.out.println(
          "添加監聽器完畢");
               
          try {
                 Thread.sleep(
          3000);
                 
          //改變屬性,觸發事件
                 ds.setName("改變屬性,觸發事件");
               }

               
          catch (InterruptedException ex) {
                 ex.printStackTrace();
               }


               ds.addDemoListener(
          this);
               System.out.println(
          "添加監聽器完畢2");
               
          try {
                 Thread.sleep(
          3000);
                 
          //改變屬性,觸發事件
                 ds.setName("改變屬性,觸發事件2");
               }

               
          catch (InterruptedException ex) {
                 ex.printStackTrace();
               }


               ds.removeDemoListener(
          this);
               System.out.println(
          "添加監聽器完畢3");
               
          try {
                 Thread.sleep(
          3000);
                 
          //改變屬性,觸發事件
                 ds.setName("改變屬性,觸發事件3");
               }

               
          catch (InterruptedException ex) {
                 ex.printStackTrace();
               }



             }


             
          public static void main(String args[])
             
          {

               
          new TestDemo();
             }


             
          /**
              * demoEvent
              *
              * 
          @param dm DemoEvent
              * @todo Implement this test.DemoListener method
              
          */

             
          public void demoEvent(DemoEvent dm) {
               System.out.println(
          "事件處理方法");
               System.out.println(dm.getName());
               dm.say();
             }

          }

          posted on 2009-06-06 00:22 陳亮 閱讀(2711) 評論(0)  編輯  收藏 所屬分類: Java

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統計

          常用鏈接

          留言簿(1)

          文章分類(8)

          文章檔案(8)

          搜索

          最新評論

          主站蜘蛛池模板: 会理县| 平远县| 黄骅市| 义马市| 钟山县| 朝阳县| 新邵县| 石河子市| 社旗县| 女性| 喀喇沁旗| 乌拉特中旗| 灵川县| 玉林市| 鄂州市| 临清市| 抚松县| 金山区| 巨鹿县| 甘德县| 马关县| 南靖县| 山西省| 蓬安县| 新巴尔虎右旗| 潞城市| 济源市| 平罗县| 平和县| 南华县| 全南县| 屯昌县| 兰坪| 乾安县| 凤阳县| 衡东县| 共和县| 孙吴县| 湖州市| 集安市| 古交市|