Handling Events with Listeners
Let us put into practice what we learned of event handling in “Events and Listeners”. You can implement listener interfaces by directly using lambda expressions, method references or anonymous classes.
For example, in the following, we use a lambda expression to handle button click events in the constructor:
Java
layout.addComponent(new Button("Click Me!",
event -> event.getButton().setCaption("You made click!")));
Directing events to handler methods is easy with method references:
Java
public class Buttons extends CustomComponent {
public Buttons() {
setCompositionRoot(new HorizontalLayout(
new Button("OK", this::ok),
new Button("Cancel", this::cancel)));
}
private void ok(ClickEvent event) {
event.getButton().setCaption ("OK!");
}
private void cancel(ClickEvent event) {
event.getButton().setCaption ("Not OK!");
}
}
Using Anonymous Classes
The following example defines an anonymous class that inherits the Button.ClickListener interface.
Java
// Have a component that fires click events
Button button = new Button("Click Me!");
// Handle the events with an anonymous class
button.addClickListener(new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
button.setCaption("You made me click!");
}
});
Most components allow passing a listener to the constructor. Note that to be able to access the component from the anonymous listener class, you must have a reference to the component that is declared before the constructor is executed, for example as a member variable in the outer class. You can also to get a reference to the component from the event object:
Java
final Button button = new Button("Click It!",
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
event.getButton().setCaption("Done!");
}
});