

One of the things we must take care of when we use AJAX is to notify user when an AJAX request is already in progress. This is usually done displaying an animated picture as activity indicator while the AJAX request is running. 

Wicket comes with a variant of components @AjaxButton@, @AjaxLink@ and @AjaxFallbackLink@ that display a default activity indicator during AJAX request processing. These components are respectively @IndicatingAjaxButton@, @IndicatingAjaxLink@ and @IndicatingAjaxFallbackLink@.

The default activity indicator used in Wicket can be easily integrated in our components using behavior AjaxIndicatorAppender (available in package @org.apache.wicket.extensions.ajax.markup.html@) and implementing the interface @IAjaxIndicatorAware@ (in package @org.apache.wicket.ajax@). 

@IAjaxIndicatorAware@ declares method @getAjaxIndicatorMarkupId()@ which returns the id of the markup element used to display the activity indicator. This id can be obtained from the AjaxIndicatorAppender behavior that has been added to the current component. The following code snippet summarizes the steps needed to integrate the default activity indicator with an ajaxified component:

{code}
//1-Implement interface IAjaxIndicatorAware
public class MyComponent extends Component implements IAjaxIndicatorAware {
	//2-Instantiate an AjaxIndicatorAppender
	private AjaxIndicatorAppender indicatorAppender =
			new AjaxIndicatorAppender();
	
	public MyComponent(String id, IModel<?> model) {
		super(id, model);
		//3-Add the AjaxIndicatorAppender to the component
		add(indicatorAppender);
	}
	//4-Return the markup id obtained from AjaxIndicatorAppender
	public String getAjaxIndicatorMarkupId() {		
		return indicatorAppender.getMarkupId();
	}
//...
}
{code}

If we need to change the default picture used as activity indicator, we can override method @getIndicatorUrl()@ of @AjaxIndicatorAppender@ and return the URL to the desired picture.