Section 13.5. The Java Event Model


[Page 609 (continued)]

13.5. The Java Event Model

As we saw in Chapter 4, whatever happens while the computer is running is classified as an event. Every keystroke and mouse click, every time a disk is inserted into a disk drive, an event is generated. The handling of events is an important element of GUI programming. Therefore, before we begin discussing how to design GUIs, it will be useful to review the main concepts of Java's event model.


[Page 610]

When a Java program is running, events generated by the hardware are passed up through the operating system (and through the browser, for applets) to the program. Events that belong to the program must be handled by the program (refer to Fig. 4.18). For example, if you click your browser's menu bar, that event will be handled by the browser itself. If you click a button contained in the Java program, that event should be handled by the program.

In Java, whenever something happens within a GUI component, an event object is generated and passed to the event listener registered to handle the component's events. You have seen numerous examples of this process in earlier chapters, but we've included a simple example to serve as a reminder.

Suppose you create a JButton in a GUI as follows:

private JButton clickme = new JButton("ClickMe"); 


Whenever the user clicks the JButton, an ActionEvent is generated. In order to handle these events, the GUI must register the JButton with a listener object that listens for action events. This can be done in an applet's init() method or in an application's constructor method, as in this example:

public MyGUI() {   add(clickme);  // Add clickme to the GUI and assign it a listener   clickme.addActionListener(this); } 


In this case, we have designated the GUI itself (this) as an ActionListener for clickme (Fig. 13.5). A listener is any object that implements a listener interface, which is one of the interfaces derived from java.util.EventListener. An ActionListener is an object that listens for and receives ActionEvents.

Figure 13.5. The GUI listens for action events on the JButton.


In order to complete the event-handling code, the GUI must implement the ActionListener interface. As Figure 13.6 shows, implementing an interface is a matter of declaring the interface in the class heading and implementing the methods contained in the interface, in this case the actionPerformed() method.

Figure 13.6. A simple GUI application that handles action events on a JButton.
(This item is displayed on page 611 in the print version)

import javax.swing.*; import java.awt.event.*; public class MyGUI extends JFrame                               implements ActionListener {     private JButton clickme = new JButton("ClickMe");     public MyGUI()  {                               // Add clickme to the GUI and assign it a listener         getContentPane().add(clickme);         clickme.addActionListener(this);         setSize(200,200);         setVisible(true);     } // init()     public void actionPerformed(ActionEvent e) {         if (e.getSource() == clickme) {             clickme.setText(clickme.getText()+"*");         }     } // actionPerformed()     public static void main(String args[]) {         MyGUI gui = new MyGUI();     } }  // MyGUI  class 

Now that we have implemented the code in Figure 13.6, whenever the user clicks clickme, that action is encapsulated within an ActionEvent object and passed to the actionPerformed() method. This method contains Java code that will handle the user's action in an appropriate way. For this example, it modifies the button's label by appending an asterisk to it each time it is clicked. Figure 13.7 depicts the sequence of actions and events that occur when the user clicks a button.

Figure 13.7. A UML depiction of the sequence of actions and events that take place when a button is clicked. The vertical lines represent time lines, with time running from top to bottom. The arrows between lines represent messages passing between objects.
(This item is displayed on page 611 in the print version)



[Page 611]

The methods used to handle the ActionEvent are derived from the java.util.EventObject class, the root class for all events (Fig. 13.8). Our example (Fig. 13.6) uses the get- Source() method to get a reference to the object that generated the event. To see what information is contained in an event object, we can use the toString() method to print a string representation of the event that was generated. Here's what it displays:


[Page 612]

java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=ClickMe]   on javax.swing.JButton[,58,5,83x27,   layout=javax.swing.OverlayLayout] 


Figure 13.8. An EventObject. The getSource() method is used to get the object that caused the event.


As you can see, the event generated was an ACTION_PERFORMED event, in response to the ClickMe command. The source of the event was the JButton.

13.5.1. Event Classes

Although the event model is the same for both AWT and Swing classes, the Swing package introduces many additional events. Table 13.1 lists the events generated by both AWT and Swing components. You worked with some of these when we wrote GUIs that handled ActionEvents for JButtons and JTextFields in preceding chapters.

Table 13.1. Java's AWTEvents for each Component type

Component

Event

Description

Button, JButton

ActionEvent

User clicked button

CheckBox, JCheckBox

ItemEvent

User toggled a checkbox

CheckboxMenuItem, JCheckboxMenuItem

ItemEvent

User toggled a checkbox

Choice, JPopupMenu

ItemEvent

User selected a choice

Component, JComponent

ComponentEvent

Component was moved or resized

 

FocusEvent

Component acquired or lost focus

 

KeyEvent

User typed a key

 

MouseEvent

User manipulated the mouse

Container, JContainer

ContainerEvent

Component added/removed from container

List, JList

ActionEvent

User double-clicked a list item

 

ItemEvent

User clicked a list item

Menu, JMenu

ActionEvent

User selected menu item

Scrollbar, JScrollbar

AdjustmentEvent

User moved scrollbar

TextComponent, JTextComponent

TextEvent

User edited text

TextField, JTextField

ActionEvent

User typed Enter key

Window, JWindow

WindowEvent

User manipulated window

Original source: David Flanagan, Java in a Nutshell, 2d ed., O'Reilly Associates, 1997. Modified for Swing components.


In viewing Table 13.1, remember that the classes it lists are arranged in a hierarchy. This will affect the events any given object can generate. For example, a JButton is a JComponent (Fig. 13.2), so in addition to generating ActionEvents when the user clicks on it, it can also generate MouseEvents when the user moves the mouse over it. Similarly, because a JTextField is also a JComponent, it can generate KeyEvents as well as ActionEvents.


[Page 613]

Note that the more generic events, such as those that involve moving, focusing, or resizing a component, are associated with the more generic components. For example, the JComponent class contains methods that are used to manage ComponentEvents. Because they are subclasses of JComponent, JButtons and JTextFields can also use these methods. Defining the more generic methods in the JComponent superclass is another example of the effective use of inheritance.

Effective Design: Inheritance

The higher a method is defined in the inheritance hierarchy, the broader is its use.


Table 13.2 lists events that are new with the Swing classes. Some of the events apply to new components. For example, JTable and Jtree do not have AWT counterparts. Other events provide Swing components with capabilities not available in their AWT counterparts. For example, a CaretEvent allows the programmer to have control over mouse clicks that occur within a text component.

Table 13.2. Some of the events defined in the Swing library

Component

Event

Description

JPopupMenu

PopupMenuEvent

User selected a choice

JComponent

AncestorEvent

Event occurred in an ancestor

JList

ListSelectionEvent

User double-clicked a list item

 

ListDataEvent

List's contents were changed

JMenu

MenuEvent

User selected menu item

JTextComponent

CaretEvent

Mouse clicked in text

 

UndoableEditEvent

Undoable edit occurred

JTable

TableModelEvent

Items added/removed from table

 

TableColumnModelEvent

Table column was moved

Jtree

TReeModelEvent

Items added/removed from tree

 

treeSelectionEvent

User selected a tree node

 

TReeExpansionEvent

User expanded or collapsed a tree node

JWindow

WindowEvent

User manipulated window


Tables 13.1 and 13.2 provide only a brief summary of these classes and Swing components. For further details, consult the JDK online documentation at

http://java.sun.com/docs/


Self-Study Exercises

Exercise 13.2

Is it possible to register a component with more than one listener?

Exercise 13.3

Is it possible for a component to have two different kinds of listeners?




Java, Java, Java(c) Object-Orienting Problem Solving
Java, Java, Java, Object-Oriented Problem Solving (3rd Edition)
ISBN: 0131474340
EAN: 2147483647
Year: 2005
Pages: 275

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net