1. 程式人生 > >自定義JAVA事件監聽機制

自定義JAVA事件監聽機制

JAVA中的事件機制的參與者有3種角色:Event、EventSource、Listener

1.Event:就是事件產生時具體的“事件”,用於Listener的相應的方法之中,作為引數一般存在於Listener的方法之中。

2.EventSource:事件源,它的作用主要是對事件和監聽進行統一管理,具體的接受事件的實體,比如說,你點選一個button,那麼button就是EventSource,這樣你必須使button對某些事件進行響應,你就需要註冊特定的listener,比如說MouseEvent之中的 MouseClicked方法,這時它就必須有了add方法。

3.Listener:具體的進行監聽的事件類,當有其對應的Event產生的時候,它就呼叫相應的方法進行處理。在windows程式設計裡邊這種響應使用callback機制來實現的。

首先,定義事件,使其繼承java.util.EventObject類。

import java.util.EventObject;

public class ServerUpdateEvent extends EventObject {

	private static final long serialVersionUID = 1L;

	private Object obj;

	public ServerUpdateEvent(Object source) {
		super(source);
	}

	public Object getObj() {
		return obj;
	}

}

其次,定義事件監聽管理類,實現對監聽的新增,刪除和啟動

import java.util.ArrayList;
import java.util.List;

/**
 * 事件源
 * <p/>
 * Date 2018年9月6日 下午4:24:06
 * <p/>
 * 
 */
public class ServerUpdateEventSource {

	private static List<ServerUpdateListenerInterface> listeners = new ArrayList<ServerUpdateListenerInterface>();

	public ServerUpdateEventSource() {
	}

	// 新增一個監聽
	public void addServerUpdateEventListener(ServerUpdateListenerInterface e) {
		listeners.add(e);
	}

	// 刪除一個監聽
	public void deleteServerUpdateEventListener(ServerUpdateListenerInterface e) {
		listeners.remove(e);
	}

	// 啟用監聽事件
	public void fireServerUpdateEvent(ServerUpdateEvent event) {
		for (ServerUpdateListenerInterface listener : listeners) {
			listener.handleEvent(event);
		}
	}
}

第三,定義事件監聽介面和實現 java.util.EventListener

a.介面

import java.util.EventListener;

public interface ServerUpdateListenerInterface extends EventListener {
	void handleEvent(ServerUpdateEvent serverUpdateEvent);
}

b.實現

public class ServerUpdateListener implements ServerUpdateListenerInterface {

	// 自定義事件被觸發時,根據事件執行以下操作
	protected void doReloadExecutors(ServerUpdateEvent e) {
		System.out.println(e);
	}

	@Override
	public void handleEvent(ServerUpdateEvent serverUpdateEvent) {
		doReloadExecutors(serverUpdateEvent);
	}
}

最後上測試

public class ServerListenerTest {

	public static void main(String[] args) {
		//定義事件源管理實踐
		ServerUpdateEventSource eventSource = new ServerUpdateEventSource();
		ServerUpdateListener listener = new ServerUpdateListener();
		
		// 註冊監聽,往事件源新增監聽
		eventSource.addServerUpdateEventListener(listener);
		
		// 模擬事件觸發
		ServerUpdateEvent event = new ServerUpdateEvent("HelloWorld");
		// 用事件源啟用事件,最終執行的是監聽實現類裡的@Override方法
		eventSource.fireServerUpdateEvent(event);
	}
}

執行結果

ServerUpdateEvent[source=HelloWorld]

好了一個簡單的java自定義事件和監聽的例子就實現完畢。