熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

反射在Java Swing編程中的應用

2022-06-13   來源: Java核心技術 

  學習過Java Swing的讀者一定對於Swing中相對較為復雜的事件驅動模型比較困惑雖然事件驅動模型在Java Swing中被完完全全的體現出來了但是對於一個軟件初學者而言這樣的近乎裸體的事件驅動模型確實是很難理解的

  Microsoft公司Net框架與Java Swing的GUI編程相比要簡單很多同樣是事件驅動模型Net框架就進行了大量的封裝處理Net把這種封裝稱之為委托器(Delegate)其代碼如下

  //當btnSubmit按鈕被點擊以後要求交給btnSubmit_Click方法處理

  // EventHandler在中間啟到委托器的作用

  //它負責將事件分發到指定的方法中進行處理

  thisbtnSubmitClick += new EventHandler(thisbtnSubmit_Click);

  //事件處理方法

  // object sender:事件源這裡指btnSubmit對象

  // EventArgs e:事件處理參數它保存了需要提供給程序員的必要信息

  private void btnSubmit_Click(object sender EventArgs e)

  {

  //打印This is a button語句

  SystemDiagnosticsDebugWriteLine(This is button);

  }

  作為對比我們來看看Java Swing的事件處理和委托就要復雜很多代碼如下(您若還不是很了解Swing事件驅動的話可以參考我的另外一篇文章事件驅動模型實例詳解(Java篇))

  //為btnSubmit增加偵聽器SelectHandler當btnSubmit被點擊以後

  //有偵聽器的actionPerformed負責處理該點擊事件的業務

  //由於事件源btnSubmit和偵聽器類SelectHandler處於兩個不同的類中

  //為了讓SelectHandler類取得頁面的信息我們需要將窗體對象(this)

  //傳入到偵聽器中

  btnSubmitaddActionListener(new SelectHandler(this));

  //偵聽器SelectHandler它必須實現動作事件ActionListener接口

  //以達到事件分發的作用

  class SelectHandler implements ActionListener {

  private CommonDialogDemo form = null;

  //將窗體對象CommonDialogDemo通過構造函數傳入SelectHandler類中

  public SelectHandler(CommonDialogDemo form) {

  thisform = form;

  }

  //事件處理方法當btnSubmit被點擊自動執行以下打印代碼

  publicvoid actionPerformed(ActionEvent e) {

  Systemoutprintln(This is button);

  }

  }

  根據以上代碼我們可以清晰的看到Java Swing要比Net的麻煩的多而且更不能讓人忍受的就是一個頁面如果有多個按鈕的話我們必須針對每個按鈕編寫多個事件偵聽類而且這些類一般都會被設為內部類學過軟件建模的讀者可能知道內部在軟件建模在軟件工程中是不推薦使用的所以這樣的代碼編寫明顯會增加設計冗余度和復雜度因此我們可以考慮自己編寫一個類似於Net中EventHandler一樣的事件委托類來處理事件分發

  由於我們無權修改Java的編譯器所以我在這裡將會借助於反射技術利用一個事件委托類處理所有的點擊事件代碼如下

  package cnsoftworksteachersearchsystemsupport;

  import javaawteventActionEvent;

  import javaawteventActionListener;

  import javalangreflectMethod;

  /**

  *該類是用來處理所有的Swing按鈕點擊事件並根據將處理權<br>

  *轉交給使用者來處理

  *

  *@authorChenyu

  *

  */

  publicclass EventHandlerimplements ActionListener {

  //組件所在的窗體對象

  private Object form = null;

  //受到委托的方法名

  private String methodName = null;

  /**

  *構造函數

  *

  *@paramform 組件所在的窗體對象

  *@parammethodName 受到委托的方法名

  */

  public EventHandler(Object formString methodName) {

  thisform = form;

  thodName = methodName;

  }

  /**

  *事件處理委托方法

  */

  publicvoid actionPerformed(ActionEvent e) {

  //得到窗體對象的類型

  Class formType = thisformgetClass();

  try {

  //得到指定委托方法的類型

  Method method =

  formTypegetMethod(thodName new Class[] {egetClass()});

  //調用指定的方法

  methodinvoke(thisform new Object[] {e});

  }catch(Exception ex) {

  return;

  }

  }

  }

  現在我們來編寫一個測試程序代碼如下

  btnSearchaddActionListener(new EventHandler(thisbtnSearch_Click));

  public void btnSearch_Click(ActionEvent e) {

  Systemoutprintln(This is btnSearch);

  }

  從以上代碼中我們可以清晰的看到事件處理和事件委托處於同一窗體中了Net方便的Delegate處理被我們用反射實現了


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27041.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.