![Page 1: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/1.jpg)
Chapter 10 Getting Started with GUI Programming
GUI Class Hierarchy Frames
– Creating frames, centering frames, adding components to frames Layout Managers
– FlowLayout, GridLayout, BorderLayout Drawing on Panels
– The paintComponent method Using Colors, Fonts, and Font Metrics Drawing Geometric Figures
– Lines, Rectangles, Ovals, Arcs, and Polygons Event-Driven Programming
– Event Source, Listener, Listener Interface
![Page 2: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/2.jpg)
GUI Class Hierarchy (Swing)
Dimension
Font
FontMetrics
Component
Graphics
Object Color
Container
Panel Applet
Frame
Dialog
Window
JComponent
JApplet
JFrame
JDialog
Swing Components in the javax.swing package
Lightweight
Heavyweight
Classes in the java.awt package
1
LayoutManager
*
![Page 3: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/3.jpg)
JComponent
.
JButton
JMenuItem
JCheckBoxMenuItem
AbstractButton
JComponent
JMenu
JRadioButtonMenuItem
JToggleButton JCheckBox
JRadioButton
JComboBox
JInternalFrame JLayeredPane
JList JMenuBar JOptionPane
JPopupMenu
JProgressBar
JPane
JFileChooser
JScrollBar JScrollPane
JSeparator
JSplitPane
JSlider
JTabbedPane
JTable
JTableHeader
JTextField JTextComponent
JEditorPane
JTextArea
JToolBar
JToolTip
JTree
JRootPane
JPanel
JPasswordField
JColorChooser
JLabel
![Page 4: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/4.jpg)
AWT (Optional)AWTEvent
Font
FontMetrics
Component
Graphics
Object Color
Canvas
Button
TextComponent
Label
List
CheckBoxGroup
CheckBox
Choice
Container Panel Applet
Frame
Dialog FileDialog
Window
TextField
TextArea
MenuComponent MenuItem
MenuBar
Menu
Scrollbar
LayoutManager
![Page 5: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/5.jpg)
Frames
Frame is a window that is not contained inside another window. Frame is the basis to contain other user interface components in Java GUI applications.
The Frame class can be used to create windows.
For Swing GUI programs, use JFrame class to create widows.
![Page 6: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/6.jpg)
UI Components
Frame Pull-down Menus
User InterfaceComponents (UI)
Panel
Panel
Panel
UI
Panel
UI
Panel
UI
Applet
Panel
User InterfaceComponents
Panel
User InterfaceComponents
Panel
User InterfaceComponents
Panel
User InterfaceComponents
panel
Pull-down Menus
![Page 7: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/7.jpg)
Creating Frames
RunRun
import javax.swing.*;public class MyFrame { public static void main(String[] args) { JFrame frame = new JFrame("Test Frame"); frame.setSize(400, 300); frame.setVisible(true); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); }
}
NOTE: You must have JDK 1.3 or higher to run the slides.
![Page 8: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/8.jpg)
Centering Frames
By default, a frame is displayed in the upper-left corner of the screen. To display a frame at a specified location, you can use the setLocation(x, y) method in the JFrame class. This method places the upper-left corner of a frame at location (x, y).
![Page 9: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/9.jpg)
Centering Frames, cont.
RunRunCenterFrameCenterFrame
screenHeight
screenWidth
getHeight()
getWidth()
(x, y)
Frame
Screen
(0, 0)
![Page 10: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/10.jpg)
Adding Components into a Frame
// Add a button into the frame frame.getContentPane().add( new JButton("OK"));
RunRunMyFrameWithComponentsMyFrameWithComponents
![Page 11: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/11.jpg)
NOTE
The content pane is a subclass of Container.
The statement in the preceding slide can be
replaced by the following two lines:
Container container =
frame.getContentPane();
container.add(new JButton("OK"));
You may wonder how a Container object is
created. It is created when a JFrame object
is created. A JFrame object uses the content
pane to hold components in the frame.
![Page 12: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/12.jpg)
Layout Managers
Java’s layout managers provide a level of
abstraction to automatically map your user
interface on all window systems.
The UI components are placed in containers.
Each container has a layout manager to
arrange the UI components within the
container.
![Page 13: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/13.jpg)
Kinds of Layout Managers FlowLayout (Chapter 10)
GridLayout (Chapter 10)
BorderLayout (Chapter 10)
CardLayout (Chapter 12)
GridBagLayout (Chapter 12)
![Page 14: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/14.jpg)
Example 10.1Testing the FlowLayout Manager
The components are arranged in the container from left to right in the order in which they were added. When one row becomes filled, a new row is started.
ShowFlowLayoutShowFlowLayout RunRun
![Page 15: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/15.jpg)
FlowLayout Constructors public FlowLayout(int align, int hGap, int vGap)
Constructs a new FlowLayout with a specified alignment, horizontal gap, and vertical gap. The gaps are the distances inpixel between components.
public FlowLayout(int alignment)
Constructs a new FlowLayout with a specified alignment and a default gap of five pixels for both horizontal and vertical.
public FlowLayout()
Constructs a new FlowLayout with a defaultcenter alignment and a default gap of five pixelsfor both horizontal and vertical.
![Page 16: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/16.jpg)
Example 10.2Testing the GridLayout Manager
The GridLayout manager arranges componentsin a grid (matrix) formation with the number ofrows and columns defined by the constructor. The components are placed in the grid from left to right starting with the first row, then the second, and so on.
ShowGridLayoutShowGridLayout RunRun
![Page 17: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/17.jpg)
GridLayout Constructors public GridLayout(int rows,int columns)
Constructs a new GridLayout with the specified number of rows and columns.
public GridLayout(int rows, int columns, int hGap, int vGap)
Constructs a new GridLayout with thespecified number of rows and columns,along with specified horizontal andvertical gaps between components.
![Page 18: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/18.jpg)
Example 10.3Testing the BorderLayout
Manager
The BorderLayout manager divides the container into five areas: East, South, West, North, and Center. Components are added to a BorderLayout by using the add method.
ShowBorderLayoutShowBorderLayout RunRun
add(Component, constraint), where constraint is BorderLayout.EAST, BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.NORTH, or BorderLayout.CENTER.
![Page 19: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/19.jpg)
Example 10.3, cont.
ShowBorderLayoutShowBorderLayout RunRun
![Page 20: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/20.jpg)
Using Panels as Containers
Panels act as smaller containers for grouping user interface components.
It is recommended that you place the user interface components in panels and place the panels in a frame. You can also place panels in a panel.
![Page 21: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/21.jpg)
Example 10.4 Testing Panel This example uses panels to organize components. The program creates a user interface for a Microwave oven.
TestPanelsTestPanels RunRun
A button
A textfield
12
buttons
frame
p2
p1
![Page 22: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/22.jpg)
Drawing on Panels
JPanel can be used to draw graphics (including text) and enable user interaction.
To draw in a panel, you create a new class that extends JPanel and override the paintComponent method to tell the panel how to draw things. You can then display strings, draw geometric shapes, and view images on the panel.
![Page 23: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/23.jpg)
Drawing on Panels, cont.public class DrawMessage extends JPanel { /** Main method */ public static void main(String[] args) { JFrame frame = new JFrame("DrawMessage"); frame.getContentPane().add(new DrawMessage()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 200); frame.setVisible(true); } /** Paint the message */ public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("Welcome to Java!", 40, 40); }}
![Page 24: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/24.jpg)
Drawing on Panels, cont.
![Page 25: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/25.jpg)
NOTE
The Graphics class is an abstract class for displaying figures and images on the screen on different platforms. The Graphics class is implemented on the native platform in the JVM. When you use the paintComponent method to draw things on a graphics context g, this g is an instance of a concrete subclass of the abstract Graphics class for the specific platform. The Graphics class encapsulates the platform details and enables you to draw things uniformly without concerning specific platforms.
![Page 26: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/26.jpg)
NOTE
Whenever a component is displayed, a Graphics object is created for the component. The Swing components use the paintComponent method to draw things. The paintComponent method is automatically invoked to paint the graphics context when the component is first displayed or whenever the component needs to be redisplayed. Invoking super.paintComponent(g) is necessary to ensure that the viewing area is cleared before a new drawing is displayed.
![Page 27: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/27.jpg)
NOTE
To draw things, normally you create a subclass of JPanel and override its paintComponent method to tell the system how to draw. In fact, you can draw things on any GUI component.
![Page 28: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/28.jpg)
The Color Class
Color c = new Color(r, g, b);
r, g, and b specify a color by its red, green, and blue components.
Example:Color c = new Color(128, 100, 100);
![Page 29: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/29.jpg)
Setting ColorsYou can use the following methods to set the component’s background and foreground colors:
setBackground(Color c)
setForeground(Color c)
Example:
setBackground(Color.yellow); setForeground(Color.red);
![Page 30: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/30.jpg)
The Font Class
Font myFont = Font(name, style, size);
Example:Font myFont = new Font("SansSerif ", Font.BOLD, 16);
Font myFont = new Font("Serif", Font.BOLD+Font.ITALIC, 12);
![Page 31: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/31.jpg)
Finding All Available Font Names
GraphicsEnvironment e =
GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontnames = e.getAvailableFontFamilyNames();
for (int i = 0; i < fontnames.length; i++)
System.out.println(fontnames[i]);
![Page 32: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/32.jpg)
Setting Fontspublic void paint(Graphics g) {
Font myFont = new Font("Times", Font.BOLD, 16);
g.setFont(myFont);
g.drawString("Welcome to Java", 20, 40);
//set a new font
g.setFont(new Font("Courier", Font.BOLD+Font.ITALIC, 12));
g.drawString("Welcome to Java", 20, 70);
}
![Page 33: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/33.jpg)
The FontMetrics Class
public void paint(Graphics g) {
g.getFontMetrics(Font f); or g.getFontMetrics();}
![Page 34: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/34.jpg)
Get FontMetrics public int getAscent()
public int getDescent()
public int getLeading()
public int getHeight()
public int stringWidth(String str)
![Page 35: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/35.jpg)
Example 10.5Using FontMetrics
Objective: Display “Welcome to Java” in SansSerif 20-point bold, centered in the frame.
MessagePanelMessagePanel
RunRun
TestFontMetricsTestFontMetrics
![Page 36: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/36.jpg)
Example 10.5, cont.
MessagePanel -xCoordinate: int -yCoordinate: int -centered: boolean -message: String +getMessage(): String +getXCoordinate(): int +getYCoordinate(): int +isCentered(): boolean +setMessage(message: String): void +setXCoordinate(x: int): void +setYCoordinate(y: int): void +setCentered(centered: boolean): void +paintComponent(g: Graphics): void +getPerferredSize(): Dimension +getMinimumSize(): Dimension
1 TestFontMetrics
JPanel -char token +getToken +setToken +paintComponet +mouseClicked
JFrame -char token +getToken +setToken +paintComponet +mouseClicked
1
![Page 37: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/37.jpg)
Drawing Geometric Figures
Drawing Lines Drawing Rectangles Drawing Ovals Drawing Arcs Drawing Polygons
![Page 38: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/38.jpg)
Drawing Lines
drawLine(x1, y1, x2, y2);
![Page 39: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/39.jpg)
Drawing Rectangles drawRect(x, y, w, h);
fillRect(x, y, w, h);
![Page 40: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/40.jpg)
Drawing Rounded Rectangles drawRoundRect(x, y, w, h, aw, ah);
fillRoundRect(x, y, w, h, aw, ah);
![Page 41: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/41.jpg)
Drawing Ovals drawOval(x, y, w, h);
fillOval(x, y, w, h);
![Page 42: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/42.jpg)
Drawing Arcs drawArc(x, y, w, h, angle1, angle2); fillArc(x, y, w, h, angle1, angle2);
![Page 43: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/43.jpg)
Drawing Polygonsint[] x = {40, 70, 60, 45, 20};int[] y = {20, 40, 80, 45, 60};g.drawPolygon(x, y, x.length);g.fillPolygon(x, y, x.length);
![Page 44: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/44.jpg)
Example 10.6Drawing a Clock
Objective: Use drawing and trigonometric methods to draw a clock showing the specified hour, minute, and second in a frame.
DisplayClockDisplayClock
RunRun
DrawClockDrawClock
![Page 45: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/45.jpg)
Drawing Clock
xEnd = xCenter + handLength sin()
yEnd = yCenter - handLength cos()Since there are sixty seconds in one minute, the angle for the second hand is
second (2/60)
![Page 46: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/46.jpg)
Drawing Clock, cont.xEnd = xCenter + handLength sin()
yEnd = yCenter - handLength cos()The position of the minute hand is
determined by the minute and second. The exact minute value comined with seconds is minute + second/60. For example, if the time is 3 minutes and 30 seconds. The total minutes are 3.5. Since there are sixty minutes in one hour, the angle for the minute hand is (minute + second/60) (2/60)
![Page 47: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/47.jpg)
Drawing Clock, cont.
xEnd = xCenter + handLength sin()
yEnd = yCenter - handLength cos()Since one circle is divided into twelve hours, the angle for the hour hand is (hour + minute/60 + second/(60 60))) (2/12)
![Page 48: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/48.jpg)
Event-Driven Programming
Procedural programming is executed in procedural order.
In event-driven programming, code is executed upon activation of events.
![Page 49: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/49.jpg)
Events
An event can be defined as a type of signal to the program that something has happened.
The event is generated by external user actions such as mouse movements, mouse button clicks, and keystrokes, or by the operating system, such as a timer.
![Page 50: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/50.jpg)
Event Information id: A number that identifies the event. target: The source component upon which the event
occurred. arg: Additional information about the source components. x, y coordinates: The mouse pointer location when a
mouse movement event occurred. clickCount: The number of consecutive clicks for the
mouse events. For other events, it is zero. when: The time stamp of the event. key: The key that was pressed or released.
![Page 51: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/51.jpg)
Event Classes
![Page 52: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/52.jpg)
Selected User Actions
Source Event TypeUser Action Object Generated
Clicked on a button JButton ActionEvent
Changed text JTextComponent TextEvent
Double-clicked on a list item JList ActionEvent
Selected or deselected an item JList ItemEvent with a single click
Selected or deselected an item JComboBox ItemEvent
![Page 53: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/53.jpg)
The Delegation Model
![Page 54: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/54.jpg)
Selected Event Handlers Event Class Listener Interface Listener Methods (Handlers)ActionEvent ActionListener actionPerformed(ActionEvent)ItemEvent ItemListener itemStateChanged(ItemEvent)WindowEvent WindowListener windowClosing(WindowEvent)
windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)
ContainerEvent ContainerListener componentAdded(ContainerEvent)componentRemoved(ContainerEvent)
![Page 55: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/55.jpg)
Example 10.7Handling Simple Action Events
Objective: Display two buttons OK and Cancel in the window. A message is displayed on the console to indicate which button is clicked, when a button is clicked.
TestActionEventTestActionEvent
RunRun
![Page 56: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/56.jpg)
Example 10.8Handling Window Events
TestWindowEventTestWindowEvent RunRun
Objective: Demonstrate handling the window events. Any subclass of the Window class can generate the following window events: window opened, closing, closed, activated, deactivated, iconified, and deiconified. This program creates a frame, listens to the window events, and displays a message to indicate the occurring event.
![Page 57: Chapter 10 Getting Started with GUI Programming](https://reader035.vdocuments.mx/reader035/viewer/2022062422/568133dd550346895d9acfac/html5/thumbnails/57.jpg)
Example 10.9 Multiple Listeners for a Single
Source
TestMultipleListenerTestMultipleListener RunRun
Objective: This example modifies Example 10.7 to add a new listener for each button. The two buttons OK and Cancel use the frame class as the listner. This example creates a new listener class as an additional listener for the action events on the buttons. When a button is clicked, both listeners respond to the action event.