Home | Download | PDF | API | FAQ | Search | Feedback | History

> ## Handling Events for Custom Components

> As explained in Implementing an Event Listener (page 398), 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` using 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` object that represents the event generated by clicking on the image map. Next, it casts it to an `AreaSelectedEvent` object. Then this method gets the `MapComponent` associated with the event. It then gets the value of the `MapComponent` object'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` object, which is constructed elsewhere in the `LocaleBean` class. Finally the method sets the locale of the `FacesContext` instance to the `Locale` obtained from the `HashMap` object.

> 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 `MapComponent` to fire events in the first place, it must implement `ActionSource`. Because `MapComponent` extends `UICommand`, it also implements `ActionSource`.