I have the following code:
JButton button = new JButton(\"Clear\");
button.addActionListener(this);
As far as I understand I create a butto
Each JButton, has an EventListenerList. Calling addActionListener(this)
adds your ActionListener, a callback function named actionPerformed()
, to the list. You can see an outline of the code that calls your method here. The actual fireActionPerformed()
method is in AbstractButton. A JButton is a JComponent, which you can see listed among the various classes that use the event listener list mechanism.
You call button.addActionListener( this )
, because this
implements the interface ActionListener. When the button is clicked, the method actionPerformed(ActionEvent e)
(defined by the interface and implemented by your class) is called.
The event generator is told about the object which can handle its events Event Generators have a method; — addActionListener(reference to the object of Handler class) For example,
JButton b1=new JButton("My Button");
b1.addActionListener(this); // Please note listener and generator are same class
Since event handler is in same object that contains
button, so we have to use this
to pass the reference.
An ActionListener is a callback mechanism. Whenever a control it is added to fires an ActionEvent
, the public void actionPerformed(ActionEvent e)
method will be invoked.
What I do not understand is where the actionPerformed is called. I see that it is defined within the class but there is no place where this method is called.
This is called by the internal mechanisms of the UI component. Conceptually, you can think of the code looking a bit like this:
public class Button {
private final List<ActionListener> listeners = new ArrayList<ActionListener>();
public void addActionListener(ActionListener l) {
listeners.add(l);
}
public void click() {
ActionEvent event = new ActionEvent(this, 0, "click");
for (ActionListener l : listeners) {
l.actionPerformed(event);
}
}
}
Basically the mechanism of UI event handling is the JVM queues events, and each type of event has its subscribers. When an event is fired, like the button is clicked, the JVM will accordingly delegate the processing to the event's subscriber. And this subscriber class has to define the method, or, event handler, to process the event.
In your case, when calling button.addActionListener(this); the code actually subscribes this KeyEventDemo instance to the event of type click. Then, when the button is clicked, the KeyEventDemo's method of actionPerformed will be triggered.