The JFC Swing Tutorial: A Guide to Constructing GUIs (2nd Edition)

 < Day Day Up > 

If you've read Handling Events (page 19) in Chapter 2, or any of the component how-to pages, you probably already know the basics of event listeners.

Let's look at one of the simplest event-handling examples possible. It's called Beeper , and it features a button that beeps when you click it. You can run Beeper using Java Web Start or compile and run the example yourself. [1] (See Figure 1.)

[1] To run Beeper using Java Web Start, click the Beeper link on the RunExamples/events.html page on the CD. You can find the source files here: JavaTutorial/uiswing/events/example-1dot4/index.html#Beeper .

Figure 1. The Beeper application.

Here's the code that implements the event handling for the button:

public class Beeper ... implements ActionListener { ... //where initialization occurs: button.addActionListener(this); ... public void actionPerformed(ActionEvent e) { ...//Make a beep sound... } }

The Beeper class implements the ActionListener interface, [2] which contains one method: actionPerformed . Since Beeper implements ActionListener , a Beeper object can register as a listener for the action events that buttons fire. Once the Beeper has been registered using the Button addActionListener method, the Beeper 's actionPerformed method is called every time the button is clicked.

[2] For more details on ActionListener , see How to Write an Action Listener (page 646) in Chapter 10.

Multiple Listeners Example

The event model, which you saw at its simplest in the preceding example, is quite powerful and flexible. Any number of event listener objects can listen for all kinds of events from any number of event source objects. For example, a program might create one listener per event source. Or a program might have a single listener for all events from all sources. A program can even have more than one listener for a single kind of event from a single event source. (See Figure 2.)

Figure 2. Multiple listeners can register to be notified of events of a particular type from a particular source. Also, the same listener can listen to notifications from different objects.

Each event is represented by an object that gives information about the event and identifies the event source. Event sources are often components or models, but other kinds of objects can also be event sources.

The following example demonstrates that event listeners can be registered on multiple objects and that the same event can be sent to multiple listeners. The example contains two event sources ( JButton instances) and two event listeners. One of the event listeners (an instance of a class called MultiListener ) listens for events from both buttons. When it receives an event, it adds the event's "action command" (which is set to the text on the button's label) to the top text area. The second event listener (an instance of a class called Eavesdropper ) listens for events on only one of the buttons. When it receives an event, it adds the action command to the bottom text area.

Figure 3. The MultiListener applet.

Try This:

  1. Run MultiListener using Java Web Start or compile and run the example yourself. [3]

    [3] To run MultiListener using Java Web Start, click the MultiListener link on the RunExamples/events.html page on the CD. You can find the source files here: JavaTutorial/uiswing/events/example-1dot4/index.html#MultiListener .

  2. Click the Blah blah blah button. Only the MultiListener object is registered to listen to this button.

  3. Click the You don't say! button. Both the MultiListener object and the Eavesdropper object are registered to listen to this button.

You can find the entire program in MultiListener.java . Here's the code that implements the event handling for the button:

public class MultiListener ... implements ActionListener { ... //where initialization occurs: button1.addActionListener(this); button2.addActionListener(this); button2.addActionListener(new Eavesdropper(bottomTextArea)); } public void actionPerformed(ActionEvent e) { topTextArea.append(e.getActionCommand() + newline); } } class Eavesdropper implements ActionListener { ... public void actionPerformed(ActionEvent e) { myTextArea.append(e.getActionCommand() + newline); } }

In the above code, both MultiListener and Eavesdropper implement the ActionListener interface and register as action listeners using the JButton addActionListener method. Both classes' implementations of the actionPerformed method are similar: They simply add the event's action command to a text area.

 < Day Day Up > 

Категории