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
}
});
}