C# 的事件處理模式

C# 的事件處理模式很簡單,打開屬性視窗(Property Window),先看到是表單的屬性,接著點選屬性視窗上方的閃電圖示按鈕,就可以看到跟表單相關的事件。如 Click 事件就是在表單上單擊滑鼠的事件,如 MouseMove 事件就是當滑鼠游標在表單上移動的事件。相關程式代碼如下:

private void InitializeComponent() { ..... 略 this.Click += new System.EventHandler(this.Form1_Click); this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove); } private void Form1_Click(object sender, System.EventArgs e) { this.Text = "Form1 被滑鼠點擊過了"; } private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { this.Text = "Form1 上的滑鼠移動過了"; }

程式人員只要撰寫 Form1_Click 及 Form1_MouseMove 裏面的代碼即可,相關的初始化代碼 InitializeComponent 由 C# 自動產生了,很簡單又方便吧。

Java 的事件處理模式

Java 的事件處理模式也很簡單,以 eclispe 為例,在 JFrame 標題列上按右鍵,選 Events→Add Events...。接著出現 Add Event page 視窗,標題列上會顯示是為那一個物件 add event,現在應該顯示 Add Event - this-"JFrame"。左邊會列出所有 Java Event,右邊則可以選擇要用 extends 或 implements。Mouse - MouseAdapter→mouseClicked 就相當於 C# Click 事件,Mouse Motion - MouseMotionAdapter→mouseMoved 就相當於 C# MouseMove 事件。相關程式代碼如下:

private void initialize() { ..... 略 this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseMoved(java.awt.event.MouseEvent e) { System.out.println("mouseMoved()"); // TODO Auto-generated Event stub mouseMoved() } }); this.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { System.out.println("mouseClicked()"); // TODO Auto-generated Event stub mouseClicked() } }); }

程式人員只要撰寫 mouseMoved 及 mouseClicked 裏面的代碼即可,相關的初始化代碼 initialize 由 eclispe 自動產生了,很簡單又方便吧。

重覆事件處理

當表單上有一堆按鈕要處理,但是每個按鈕處理函數都完全一樣時,在 C# 事件處理就變得很簡單,只要把事件處理函數指向同一個函數即可。在 Java 就完全不同了,需要一直重覆建立內部匿名類別,造成類別過多且代碼重覆,所以就利用了 Java 反射機制建立了一個類似 C# 事件處理模式。相關代碼如下:

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.Method; public class ActionHandler <T> implements ActionListener { private T formObject=null; private String methodName=null; public ActionHandler(T formObject, String methodName) { this.formObject = formObject; this.methodName = methodName; } @Override public void actionPerformed(ActionEvent arg0) { Class<? extends Object> formClass = this.formObject.getClass(); try { Method methodObject = formClass.getMethod(this.methodName, arg0.getClass()); methodObject.invoke(this.formObject, arg0); } catch (Exception e) { e.printStackTrace(); } } } ..... 略 private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setText("TEST"); jButton.addActionListener(new ActionHandler(this, "testButton")); } return jButton; } public void testButton(ActionEvent e) { System.out.println(e.getActionCommand()); }

參考文章:http://blog.csdn.net/frank_softworks/archive/2007/08/25/1758329.aspx

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()