Java event事件監聽屬性值變化 demo
阿新 • • 發佈:2019-02-06
1、定義一個 ValueChangedEvent
ValueChangedEvent用於在設定屬性值的時候,觸發事件。
package org.teamlet; import java.util.EventObject; public class ValueChangeEvent extends EventObject { /** * */ private static final long serialVersionUID = 767352958358520268L; private int value; public ValueChangeEvent(Object source) { this(source, 0); } public ValueChangeEvent(Object source, int newValue) { super(source); value = newValue; } public int getValue() { return value; } }
2、定義監聽介面 ValueChangeListener
ValueChangeListener 提供屬性值變化的介面。
package org.teamlet;
public interface ValueChangeListener extends java.util.EventListener {
public abstract void performed(ValueChangeEvent e);
}
3、事件的產生者
EventProducer提供了監聽容器listenerRegister,負責消費者的註冊。
package org.teamlet; public class EventProducer { ListenerRegister register = new ListenerRegister(); private int value; public int getValue() { return value; } public void setValue(int newValue) { if (value != newValue) { value = newValue; ValueChangeEvent event = new ValueChangeEvent(this, value); fireAEvent(event); } } public void addListener(ValueChangeListener a) { register.addListener(a); } public void removeListener(ValueChangeListener a) { register.removeListener(a); } public void fireAEvent(ValueChangeEvent event) { register.fireAEvent(event); } }
4、註冊器
ListenerRegister負責註冊和分發事件。
package org.teamlet; import java.util.Vector; public class ListenerRegister { private Vector<ValueChangeListener> listeners = new Vector<ValueChangeListener>(); public synchronized void addListener(ValueChangeListener a) { listeners.addElement(a); } public synchronized void removeListener(ValueChangeListener a) { listeners.removeElement(a); } @SuppressWarnings("unchecked") public void fireAEvent(ValueChangeEvent evt) { Vector<ValueChangeListener> currentListeners = null; synchronized (this) { currentListeners = (Vector<ValueChangeListener>) listeners.clone(); } for (int i = 0; i < currentListeners.size(); i++) { ValueChangeListener listener = (ValueChangeListener) currentListeners .elementAt(i); listener.performed(evt); } } }
5、事件的消費者
EventConsumer實現ValueChangedListener,當EventProducer 傳送事件時,接收事件。
package org.teamlet;
public class EventConsumer implements ValueChangeListener {
@Override
public void performed(ValueChangeEvent e) {
System.out.println("value changed, new value = " + e.getValue());
}
}
6、使用
package org.teamlet;
public class Main {
public static void main(String[] args) {
EventProducer producer = new EventProducer();
producer.addListener(new EventConsumer());
producer.setValue(2);
}
}