Download
FAQ
History
PrevHomeNext API
Search
Feedback
Divider

Handling Events for Custom Components

As explained in Implementing an Event Listener, events are automatically queued on standard components that fire events. A custom component, on the other hand, must manually queue events from its decode method if it fires events.

Performing Decoding explains how to queue an event on MapComponent in its decode method. This section explains how to write the class representing the event of clicking on the map and how to write the method that processes this event.

As explained in Understanding the JSP Page, the actionListener attribute of the map tag points to the chooseLocaleFromMap method of the bean LocaleBean. This method processes the event of clicking the image map. Here is the chooseLocaleFromMap method of LocaleBean:

public void chooseLocaleFromMap(ActionEvent actionEvent) {
  AreaSelectedEvent event = (AreaSelectedEvent) actionEvent;
  String current = event.getMapComponent().getCurrent();
  FacesContext context = FacesContext.getCurrentInstance();
  context.getViewRoot().setLocale((Locale)
    locales.get(current));
  ...
}  

When the JavaServer Faces implementation calls this method, it passes in an ActionEvent that represents the event generated by clicking on the image map. Next, it casts it to an bookstore6/src/listeners/AreaSelectedEvent. Then this method gets the MapComponent associated with the event. It then gets the value of the MapComponent's current attribute, which indicates the currently selected area. The method then uses the value of the current property to get the Locale object from a HashMap, which is constructed elsewhere in the LocaleBean class. Finally the method sets the locale of the FacesContext to the Locale obtained from the HashMap.

In addition to the method that processes the event, you need the event class itself. This class is very simple to write: You have it extend ActionEvent and provide a constructor that takes the component on which the event is queued and a method that returns the component. Here is the AreaSelectedEvent class used with the image map:

public class AreaSelectedEvent extends ActionEvent {
  ...
  public AreaSelectedEvent(MapComponent map) {
    super(map);
  }
  public MapComponent getMapComponent() {
    return ((MapComponent) getComponent());
  }
} 

As explained in the section Creating Custom Component Classes, in order for the MapComponent to fire events in the first place, it must implement ActionSource. Because MapComponent extends UICommand, it also implements ActionSource.

Divider
Download
FAQ
History
PrevHomeNext API
Search
Feedback
Divider

All of the material in The J2EE(TM) 1.4 Tutorial is copyright-protected and may not be published in other works without express written permission from Sun Microsystems.