陈宇博客

Softworks对日软件人才培训高级讲师专栏

陈宇ID:frank_softworks
21755次访问,排名5123(-1)好友1人,关注者10
,主要从事,系统设计,软件开发和新人培训 ,5年以上软件开发经验,10个以上C/S和B/S软件系统开发经验,
熟练使用VB.net,C++,C#,ASP.net,JSP,JS,VBS,Java2,
熟悉J2EE企业级开发及架构,
熟练使用SQL Server,Oracle,DB2数据库,
受过专业软件管理培训,深刻了解企业级软件管理及实施
frank_softworks的文章
原创 7 篇
翻译 0 篇
转载 0 篇
评论 46 篇
最近评论
hfgayy:是不是也可以理解为:

用TigerTank类的构造器去初始化Tank的一个对象呢?
lishengwei:不太懂呵呵呵
wugui89:没看明白
yychaorenlaile:前辈,能和您认识吗?我也有一腔为中国软件事业的腾飞而奋斗的热血。您QQ是多少?我的是496953164
Colin_Liu:针对楼主的例子frank_softworks所说的解除耦是指清洁工人与清洁工具之间的解耦,而所举的例子是利用反射机制实现BeanFactory与清洁工具的解耦。清洁工人与清洁工具之间的解藕确实和反射没啥联系啊。我认为这才是引起争论的关键点。
文章分类
    收藏
      相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 反射在Java Swing中的应用收藏

      新一篇: 新帆起航,目标新大陆,感谢大家.... | 旧一篇: 集合框架的授课感想

       
      学习过Java Swing的读者一定对于Swing中相对较为复杂的事件驱动模型比较困惑,虽然事件驱动模型在Java Swing中被完完全全的体现出来了,但是对于一个软件初学者而言这样的近乎“裸体”的事件驱动模型确实是很难理解的。

      Microsoft公司.Net框架与Java SwingGUI编程相比要简单很多,同样是事件驱动模型.Net框架就进行了大量的封装处理,.Net把这种封装称之为委托器(Delegate)其代码如下:

      //当btnSubmit按钮被点击以后要求交给btnSubmit_Click方法处理
      // EventHandler在中间启到委托器的作用,
      //它负责将事件分发到指定的方法中进行处理
      this.btnSubmit.Click += new EventHandler(this.btnSubmit_Click);
      //事件处理方法
      // object sender:事件源,这里指btnSubmit对象
      // EventArgs e:事件处理参数,它保存了需要提供给程序员的必要信息
          private void btnSubmit_Click(object sender, EventArgs e)
          {
              //打印This is a button语句
              System.Diagnostics.Debug.WriteLine("This is button");
      }
       

      作为对比,我们来看看Java Swing的事件处理和委托就要复杂很多:代码如下:(您若还不是很了解Swing事件驱动的话,可以参考我的另外一篇文章:事件驱动模型实例详解(Java)

      //为btnSubmit增加侦听器SelectHandler,当btnSubmit被点击以后
      //有侦听器的actionPerformed负责处理该点击事件的业务
      //由于事件源btnSubmit和侦听器类SelectHandler处于两个不同的类中
      //为了让SelectHandler类取得页面的信息,我们需要将窗体对象(this)
      //传入到侦听器中
      btnSubmit.addActionListener(new SelectHandler(this));
      //侦听器SelectHandler,它必须实现动作事件ActionListener接口
      //以达到事件分发的作用
      class SelectHandler implements ActionListener {
          private CommonDialogDemo form = null;
          //将窗体对象CommonDialogDemo通过构造函数传入SelectHandler类中
          public SelectHandler(CommonDialogDemo form) {
              this.form = form;
          }
          //事件处理方法,当btnSubmit被点击,自动执行以下打印代码
          publicvoid actionPerformed(ActionEvent e) {
              System.out.println("This is button");
          }
      }

       

      根据以上代码,我们可以清晰的看到Java Swing要比.Net的麻烦的多,而且更不能让人忍受的就是,一个页面如果有多个按钮的话,我们必须针对每个按钮编写多个事件侦听类,而且这些类一般都会被设为内部类。学过软件建模的读者可能知道,内部在软件建模在软件工程中是不推荐使用的,所以这样的代码编写明显会增加设计冗余度和复杂度,因此我们可以考虑自己编写一个类似于.NetEventHandler一样的事件委托类来处理事件分发。

             由于我们无权修改Java的编译器,所以我在这里将会借助于反射技术,利用一个事件委托类处理所有的点击事件,代码如下:

      package cn.softworks.teachersearchsystem.support;
       
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import java.lang.reflect.Method;
       
      /**
       *该类是用来处理所有的Swing按钮点击事件,并根据将处理权<br>
       *转交给使用者来处理
       *
       *@authorChen.yu
       *
       */
      publicclass EventHandlerimplements ActionListener {
         
          //组件所在的窗体对象
          private Object form = null;
         
          //受到委托的方法名
          private String methodName = null;
         
          /**
           *构造函数
           *
           *@paramform           组件所在的窗体对象
           *@parammethodName     受到委托的方法名
           */
          public EventHandler(Object form,String methodName) {
              this.form = form;
              this.methodName = methodName;
          }
         
          /**
           *事件处理委托方法
           */
          publicvoid actionPerformed(ActionEvent e) {
             
              //得到窗体对象的类型
              Class formType = this.form.getClass();
             
              try {
                  //得到指定委托方法的类型
                  Method method =
                      formType.getMethod(this.methodName, new Class[] {e.getClass()});
                  //调用指定的方法
                  method.invoke(this.form, new Object[] {e});
                 
              }catch(Exception ex) {
                 
                  return;
              }      
         
          }
       
      }

       
      现在我们来编写一个测试程序,代码如下:
             btnSearch.addActionListener(
      new EventHandler(this,"btnSearch_Click"));
       
      public void btnSearch_Click(ActionEvent e) {
          System.out.println("This is btnSearch");
      }
       
      从以上代码中我们可以清晰的看到,事件处理和事件委托处于同一窗体中了,.Net方便的Delegate处理被我们用反射实现了。  

      发表于 @ 2007年08月25日 09:04:00|评论(loading...)|编辑

      新一篇: 新帆起航,目标新大陆,感谢大家.... | 旧一篇: 集合框架的授课感想

      评论

      #xinglongbing 发表于2007-09-11 11:27:06  IP: 61.187.64.*
      这样实现不行吗:
      class EventHandler implements ActionListener
      {
      public void actionPerformed(ActionEvent e)
      {
      if(e.getSource==button1)
      do...
      else if(e.getSource==button2)
      do...
      if(e.getSource==button3)
      do...
      }
      }这样作的话是不是存在一些扩展性上的不足
      #wy198796 发表于2007-09-11 14:44:37  IP: 211.144.123.*
      过来看看,顶一下~
      #mywish12 发表于2007-09-12 20:48:59  IP: 218.80.63.*
      JAVA中反射是王道之一,懂得此道,才是正真学了JAVA。
      楼主讲得好。赞!
      #ITshu 发表于2007-09-25 17:00:15  IP: 221.192.237.*
      没看懂
      不是很明白
      #zyhd82 发表于2007-10-07 11:34:44  IP: 61.170.142.*
      过来学习下!
      #immix 发表于2007-10-20 15:54:59  IP: 222.95.0.*
      但存在个问题就是事件委托的方法必须是public的,如果是private的就不行了,但通常对于这种按钮的响应事件,我们大多数情况下是设置成private的
      #immix 发表于2007-10-20 16:26:17  IP: 222.95.0.*
      哈哈,没仔细看帮助,可以设置成private的,在你的另一篇教程里也看到了这个办法,谢谢了
      #shadowkiss 发表于2007-11-06 16:04:13  IP: 221.0.218.*
      其实那个事件的处理方法是不应该放在窗体代码中的. 应该放于控制层调用模型层的.

      只不过这样安排比较简单而已.
      #frank_softworks 发表于2007-11-10 23:07:09  IP: 58.41.190.*
      同意shadowkiss的意见,本代码并没有写在窗体中,只是单独编写了一个委托类而已,在C/S的程序中,本人不建议将层次分的太细,MVC只是参照标准,没有必要完全遵循,只是思想可以借鉴
      #shendl 发表于2007-11-15 11:51:17  IP: 211.144.96.*
      C#的委托,实际上就是Java的Method。
      但我认为使用接口更好一下。 更清晰,更利于重用。
      #liliangjava 发表于2007-11-26 08:46:37  IP: 123.191.56.*
      不错,顶一个!!!
      #wugui89 发表于2007-12-27 22:09:29  IP: 61.184.43.*
      没看明白
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © 小宇