Saturday, 26 January 2013

Creating Your Own Event (Advanced) in JAVA


Suppose that we have a source called Light, with two operational modes (turn-on and turn-off). The source is capable of notifying its registered listeners, whenever its state changes.
  • First, we define the LightEvent class (extends from java.util.EventObject)
  • Next, we define a LightListener interface to bind the source and its listeners. This interface specifies the signature of the handlers, lightTurnedOn(LightEvent) and lightTurnedOff(LightEvent).
  • In the source Light, we use an ArrayList to maintain its listeners, and create two methods:addLightListner(LightListener) and removeLightListener(LightListener). An method called notifyListeners()is written to invoke the appropriate handlers of each of its registered listeners, whenever the state of the Light changes.
  • A listener class called LightWatcher is written, which implements the LightListener interface and provides implementation for the handlers.

Event: LightEvent.java
/** LightEvent */
import java.util.EventObject;
 
public class LightEvent extends EventObject {
   public LightEvent (Object src) {
      super(src);
   }
}
Listener Interface: LightListener.java
/** The LightListener interface */
import java.util.EventListener;
 
public interface LightListener extends EventListener {
   public void lightOn(LightEvent evt);  // called-back when the light has been turned on
   public void lightOff(LightEvent evt); // called-back when the light has been turned off
}
Source: Light.java
/** The Light Source */
import java.util.*;
 
public class Light {
   // Status - on (true) or off (false)
   private boolean on;
   // Listener list
   private List<LightListener> listeners = new ArrayList<LightListener>();
 
   /** Constructor */
   public Light() {
      on = false;
      System.out.println("Light: constructed and off");
   }
 
   /** Add the given LightListener */
   public void addLightListener(LightListener listener) {
      listeners.add(listener);
      System.out.println("Light: added a listener");
   }
 
   /** Add the given LightListener */
   public void removeLightListener(LightListener listener) {
      listeners.remove(listener);
      System.out.println("Light: removed a listener");
   }
 
   /** Turn on this light */
   public void turnOn() {
      if (!on) {
         on = !on;
         System.out.println("Light: turn on");
         notifyListeners();
      }
   }
 
   /** Turn off this light */
   public void turnOff() {
      if (on) {
         on = !on;
         System.out.println("Light: turn off");
         notifyListeners();
      }
   }
 
   /** Fire an LightEvent and notify all its registered listeners */
   private void notifyListeners() {
      LightEvent evt = new LightEvent(this);
      for (LightListener listener : listeners) {
         if (on) {
            listener.lightOn(evt);
         } else {
            listener.lightOff(evt);
         }
      }
   }
}
Listener: LightWatcher.java
/** An implementation of LightListener class */
public class LightWatcher implements LightListener {
   private int id;  // ID of this listner
 
   /** Constructor */
   public LightWatcher(int id) {
      this.id = id;
      System.out.println("LightWatcher-" + id + ": created");
   }
 
   /** Implementation of event handlers */
   @Override
   public void lightOn(LightEvent evt) {
      System.out.println("LightWatcher-" + id
         + ": I am notified that light is on");
   }
 
   @Override
   public void lightOff(LightEvent evt) {
      System.out.println("LightWatcher-" + id
         + ": I am notified that light is off");
   }
}
A Test Driver: TestLight.java
/** A Test Driver */
public class TestLight {
   public static void main(String[] args) {
      Light light = new Light();
      LightWatcher lw1 = new LightWatcher(1);
      LightWatcher lw2 = new LightWatcher(2);
      LightWatcher lw3 = new LightWatcher(3);
      light.addLightListener(lw1);
      light.addLightListener(lw2);
      light.turnOn();
      light.addLightListener(lw3);
      light.turnOff();
      light.removeLightListener(lw1);
      light.removeLightListener(lw3);
      light.turnOn();
   }
}
Below are the expected output:
Light: constructed and off
LightWatcher-1: created
LightWatcher-2: created
LightWatcher-3: created
Light: added a listener
Light: added a listener
Light: turn on
LightWatcher-1: I am notified that light is on
LightWatcher-2: I am notified that light is on
Light: added a listener
Light: turn off
LightWatcher-1: I am notified that light is off
LightWatcher-2: I am notified that light is off
LightWatcher-3: I am notified that light is off
Light: removed a listener
Light: removed a listener
Light: turn on
LightWatcher-2: I am notified that light is on

2 comments: