Java tutorial
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); } } } }