Java/Swing JFC/EventListenerList
Версия от 18:01, 31 мая 2010; (обсуждение)
Use EventListenerList to store event listener list
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
class DualListener implements ActionListener, ChangeListener {
public void actionPerformed(ActionEvent e) {
System.out.println("dual: Action " + e);
}
public void stateChanged(ChangeEvent e) {
System.out.println("dual: Change " + e);
}
}
public class Main {
public Main() {
MyObject pair = new MyObject("This is "a"", "This is "b"");
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("al: Action " + e);
}
};
DualListener dual = new DualListener();
pair.addActionListener(al);
pair.addChangeListener(dual);
pair.setA("new A");
pair.setB("new B");
pair.addActionListener(dual);
pair.setA("another A");
pair.removeActionListener(dual);
pair.setB("another B");
pair.setA("final A");
}
public static void main(String arg[]) {
new Main();
}
}
class MyObject {
Object a = null, b = null;
EventListenerList events = new EventListenerList();
ActionEvent actionEvent;
ChangeEvent changeEvent;
public MyObject(Object a1, Object b1) {
a = a1;
b = b1;
}
public void addActionListener(ActionListener listener) {
events.add(ActionListener.class, listener);
}
public void removeActionListener(ActionListener listener) {
events.remove(ActionListener.class, listener);
}
public void addChangeListener(ChangeListener listener) {
events.add(ChangeListener.class, listener);
}
public void removeChangeListener(ChangeListener listener) {
events.remove(ChangeListener.class, listener);
}
public void setA(Object newA) {
a = newA;
fireAChanged();
}
public void setB(Object newB) {
b = newB;
fireBChanged();
}
protected void fireAChanged() {
Object[] listeners = events.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ActionListener.class) {
if (actionEvent == null) {
actionEvent = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "a");
}
((ActionListener) listeners[i + 1]).actionPerformed(actionEvent);
}
}
}
protected void fireBChanged() {
Object[] listeners = events.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ChangeListener.class) {
if (changeEvent == null) {
changeEvent = new ChangeEvent(this);
}
((ChangeListener) listeners[i + 1]).stateChanged(changeEvent);
}
}
}
}