The Button class, for example, publishes click events. The associated listener interface is ClickListener.
public void anonClickListenerExample() { Button b = new Button("Click Me"); b.addClickListener(new ClickListener() { public void onClick(Widget sender) { // handle the click event } }); }Using anonymous inner classes as in the above example can be inefficient for a large number of widgets, since it could result in the creation of many listener objects. Widgets supply their
this
pointer
as the sender
parameter when they invoke a listener
method, allowing a single listener to distinguish between multiple event
publishers. This makes better use of memory but requires slightly more
code, as shown in the following example:
public class ListenerExample extends Composite implements ClickListener { private FlowPanel fp = new FlowPanel(); private Button b1 = new Button("Button 1"); private Button b2 = new Button("Button 2"); public ListenerExample() { initWidget(fp); fp.add(b1); fp.add(b2); b1.addClickListener(this); b2.addClickListener(this); } public void onClick(Widget sender) { if (sender == b1) { // handle b1 being clicked } else if (sender == b2) { // handle b2 being clicked } } }Some event interfaces specify more than one event. If you are only interested in a subset of these events, subclass one of the event "adapters". Adapters are simply empty concrete implementations of a particular event interface, from which you can derive a listener class without having to implement every method.
public void adapterExample() { TextBox t = new TextBox(); t.addKeyboardListener(new KeyboardListenerAdapter() { public void onKeyPress(Widget sender, char keyCode, int modifiers) { // handle only this one event } }); }