Download Chapter 10 Getting Started with Graphics Programming

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Chapter 12 Event-Driven Programming
Prerequisites for Part III
Chapter 8 Inheritance and Polymorphism
Chapter 9 Abstract Classes and Interfaces
Chapter 11 Getting Started with GUI Programming
Chapter 12 Event-Driven Programming
找出画中真谛
Chapter 13 Creating User Interfaces
— 保罗.塞尚
Chapter 14 Applets, Images, Audio
Liang,Introduction to Java Programming,revised by Dai-kaiyu
1
Objectives
 To explain the concept of event-driven programming (§12.2).
 To understand event, event source, and event classes (§12.2).
 To declare listener classes and write the code to handle events
(§11.3).
 To register listener objects in the source object (§11.3).
 To understand how an event is handled (§11.3).
 To write programs to deal with ActionEvent (§11.3).
 To write programs to deal with MouseEvent (§11.4).
 To write programs to deal with KeyEvent (§11.5).
 To use the Timer class to control animations (§11.6 Optional).
Liang,Introduction to Java Programming,revised by Dai-kaiyu
2
Procedural vs. Event-Driven
Programming
 Procedural programming is executed in procedural
order.
 In OO GUI programming, code is executed upon
activation of events.
 GUIs are event driven
Generate events when user interacts with GUI
e.g., moving mouse, pressing button, typing in text field,
etc.
Class java.awt.AWTEvent
Liang,Introduction to Java Programming,revised by Dai-kaiyu
3
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
clicks, and keystrokes, or by the operating
system, such as a timer.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
4
Event Classes
EventObject
AWTEvent
ActionEvent
ContainerEvent
AdjustmentEvent
FocusEvent
ComponentEvent
InputEvent
ItemEvent
PaintEvent
TextEvent
WindowEvent
MouseEvent
KeyEvent
ListSelectionEvent
Liang,Introduction to Java Programming,revised by Dai-kaiyu
5
Event Information
An event object contains whatever properties are
pertinent to the event.
You can identify the source object of the event using the
getSource() instance method in the EventObject class.
The subclasses of EventObject deal with special types of
events, such as button actions, window events, component
events, mouse movements, and keystrokes. Table 12.1
lists external user actions, source objects, and event types
generated.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
6
Selected User Actions
User Action
Source
Object
Event Type
Generated
Click a button
JButton
ActionEvent
Click a check box
JCheckBox
ItemEvent, ActionEvent
Click a radio button
JRadioButton
ItemEvent, ActionEvent
Press return on a text field
JTextField
ActionEvent
Select a new item
JComboBox
ItemEvent, ActionEvent
Window opened, closed, etc.
Window
WindowEvent
Mouse pressed, released, etc.
Component
MouseEvent
Key released, pressed, etc.
Component
KeyEvent
Liang,Introduction to Java Programming,revised by Dai-kaiyu
7
Event-Handling Model
 Event-handling model
Three parts
 Event source
• GUI component with which user interacts
 Event object
• Encapsulates information about event that occurred
 Event listener
• Receives event object when notified, then responds
Programmer must perform two tasks
 Register event listener for event source
 Implement event-handling method (event handler)
Liang,Introduction to Java Programming,revised by Dai-kaiyu
8
The Delegation Model
Register by invoking
source.addXListener(listener);
Trigger an event
source: SourceClass
User
Action
listener: ListenerClass
+addXListener(XListener listener)
Keep it a list
XListener
event: XEvent
Invoke
listener1.handler(event)
listener2.handler(event)
…
listenern.handler(event)
listener1
listener2
…
listenern
+handler(XEvent event)
Internal function of the source object
+handler(
XEvent
Liang,Introduction to Java Programming,revised by Dai-kaiyu
9
How Event Handling Works
Two open questions from
How did event handler get registered?
Answer:
• Through component’s method addActionListener
How does component know to call actionPerformed?
Answer:
• Event is dispatched only to listeners of appropriate type
• Each event type has corresponding event-listener interface
 Event ID specifies event type that occurred
For example: MouseEvent event’s ID spedify which method of the seven
events will be handler
Liang,Introduction to Java Programming,revised by Dai-kaiyu
10
The Delegation Model: Example
source: JButton
ActionListener
+addActionListener(ActionListener listener)
+actionPerformed(ActionEvent event)
Register by invoking
source.addActionListener(listener);
listener: ListenerClass
ListenerClass listener = new ListenerClass();
JButton jbt = new JButton("OK");
jbt.addActionListener(listener);
Liang,Introduction to Java Programming,revised by Dai-kaiyu
11
Event-listener interfaces of package java.awt.event
ActionListener
java.util.EventListener
AdjustmentListener
ComponentListener
ContainerListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
Key
C la ss na me
Inte rfa c e na me
TextListener
WindowListener
Liang,Introduction to Java Programming,revised by Dai-kaiyu
12
Selected Event Handlers
Event Class
Listener Interface
Listener Methods (Handlers)
ActionEvent
ItemEvent
WindowEvent
ActionListener
ItemListener
WindowListener
ContainerEvent
ContainerListener
MouseEvent
MouseListener
KeyEvent
KeyListener
actionPerformed(ActionEvent)
itemStateChanged(ItemEvent)
windowClosing(WindowEvent)
windowOpened(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseClicked(MouseEvent)
mouseExited(MouseEvent)
mouseEntered(MouseEvent)
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTypeed(KeyEvent)
Liang,Introduction to Java Programming,revised by Dai-kaiyu
13
java.awt.event.ActionEvent
java.util.EventObject
+getSource(): Object
Returns the object on which the event initially occurred.
java.awt.event.AWTEvent
java.awt.event.ActionEvent
+getActionCommand(): String
Returns the command string associated with this action. For a
button, its text is the command string.
+getModifier(): int
Returns the modifier keys held down during this action event.
+getWhen(): long
Returns the timestamp when this event occurred. The time is
the number of milliseconds since January 1, 1970, 00:00:00
GMT.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
14
Example 12.1
Handling 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.
TestActionEvent
Run
Liang,Introduction to Java Programming,revised by Dai-kaiyu
15
Example 12.2
Handling Window Events

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.
TestWindowEvent
Liang,Introduction to Java Programming,revised by Dai-kaiyu
Run
16
Example 12.3 Multiple Listeners for a
Single Source

Objective: This example modifies Example 12.1 to
add a new listener for each button. The two buttons
OK and Cancel use the frame class as the listener.
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.
TestMultipleListener
Liang,Introduction to Java Programming,revised by Dai-kaiyu
Run
17
MouseEvent
java.awt.event.InputEvent
+getWhen(): long
Returns the timestamp when this event occurred.
+isAltDown(): boolean
Returns whether or not the Alt modifier is down on this event.
+isControlDown(): boolean
Returns whether or not the Control modifier is down on this event.
+isMetaDown(): boolean
Returns whether or not the Meta modifier is down on this event
+isShiftDown(): boolean
Returns whether or not the Shift modifier is down on this event.
java.awt.event.MouseEvent
+getButton(): int
Indicates which mouse button has been clicked.
+getClickCount(): int
Returns the number of mouse clicks associated with this event.
+getPoint(): java.awt.Point
Returns a Point object containing the x and y coordinates.
+getX(): int
Returns the x-coordinate of the mouse point.
+getY(): int
Returns the y-coordinate of the mouse point.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
18
Handling Mouse Events
 Java provides two listener interfaces,
MouseListener and MouseMotionListener, to
handle mouse events.
 The MouseListener listens for actions such as when
the mouse is pressed, released, entered, exited, or
clicked.
 The MouseMotionListener listens for
actions such as dragging or moving the
mouse.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
19
Handling Mouse Events
java.awt.event.MouseListener
+mousePressed(e: MouseEvent): void
Invoked when the mouse button has been pressed on the
source component.
+mouseReleased(e: MouseEvent): void
Invoked when the mouse button has been released on the
source component.
+mouseClicked(e: MouseEvent): void
Invoked when the mouse button has been clicked (pressed and
released) on the source component.
+mouseEntered(e: MouseEvent): void
Invoked when the mouse enters the source component.
+mouseExited(e: MouseEvent): void
Invoked when the mouse exits the source component.
java.awt.event.MouseMotionListener
+mouseDragged(e: MouseEvent): void
Invoked when a mouse button is moved with a button pressed.
+mouseMoved(e: MouseEvent): void
Invoked when a mouse button is moved without a button
pressed.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
20
Example 12.4
Moving Message Using Mouse
Objective: Create a
program to display a
message in a panel.
You can use the
mouse to move the
message. The
message moves as
the mouse drags and
is always displayed
at the mouse point.
MoveMessageDemo
Liang,Introduction to Java Programming,revised by Dai-kaiyu
Run
21
Example 12.5
Handling Complex Mouse Events
Objective: Create a
program for drawing
using a mouse. Draw
by dragging with the
left mouse button
pressed; erase by
dragging with the
right button pressed.
ScribbleDemo
Liang,Introduction to Java Programming,revised by Dai-kaiyu
Run
22
Adapter Classes
Adapter class
Implements interface
Provides default implementation of each interface
method
Used when all methods in interface is not needed
Liang,Introduction to Java Programming,revised by Dai-kaiyu
23
Event adapter classes and the interfaces
they implement.
Event a da pter cla ss
ComponentAdapter
ContainerAdapter
FocusAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter
Fig. 12.18 Event a d a p ter c la sses a nd
Implements interfa ce
ComponentListener
ContainerListener
FocusListener
KeyListener
MouseListener
MouseMotionListener
WindowListener
the interfa c es they imp lement.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Fig. 12.19: Painter.java
// Using class MouseMotionAdapter.
// Java core packages
import java.awt.*;
import java.awt.event.*;
// Java extension packages
import javax.swing.*;
public class Painter extends JFrame {
private int xValue = -10, yValue = -10;
// set up GUI and register mouse event handler
public Painter()
{
super( "A simple paint program" );
// create a label and place it in SOUTH of BorderLayout
getContentPane().add(
new Label( "Drag the mouse to draw" ),
BorderLayout.SOUTH );
addMouseMotionListener(
// anonymous inner class
new MouseMotionAdapter() {
Register MouseMotionListener to
listen for window’s mouse-motion events
Override method mouseDragged,
but not method mouseMoved
// store drag coordinates and repaint
public void mouseDragged( MouseEvent event )
{
xValue = event.getX();
Store coordinates where mouse was
yValue = event.getY();
dragged, then repaint JFrame 25
repaint();
Liang,Introduction to Java Programming,revised
}
by Dai-kaiyu
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
} // end anonymous inner class
); // end call to addMouseMotionListener
setSize( 300, 150 );
setVisible( true );
}
super.paint( g ) will
clear the background
of the window. Then
will not keep the
previous voals.
// draw oval in a 4-by-4 bounding box at the specified
// location on the window
public void paint( Graphics g )
{
// we purposely did not call super.paint( g ) here to
// prevent repainting
Draw circle of diameter 4
where user dragged cursor
g.fillOval( xValue, yValue, 4, 4 );
}
// execute application
public static void main( String args[] )
{
Painter application = new Painter();
Showcase
application.addWindowListener(
// adapter to handle only windowClosing event
new WindowAdapter() {
public void windowClosing( WindowEvent event )
{
System.exit( 0 );
}
Liang,Introduction to Java Programming,revised
by Dai-kaiyu
26
70
} // end anonymous inner class
71
72
); // end call to addWindowListener
73
}
74
75 } // end class Painter
Painter.java
Liang,Introduction to Java Programming,revised
by Dai-kaiyu
27
Handling Keyboard Events
To process a keyboard event, use the following
handlers in the KeyListener interface:
 keyPressed(KeyEvent e)
Called when a key is pressed.
 keyReleased(KeyEvent e)
Called when a key is released.
 keyTyped(KeyEvent e)
Called when a key is pressed and then
released.invoked when a Unicode character is
entered. If the key dosen’t has one (eg modifier key),
the keyTyped handler will not be invoked.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
28
The KeyEvent Class
 Methods:
getKeyChar() method
getKeyCode() method
 Keys:
Home
End
Page Up
Page Down
etc...
VK_HOME
VK_End
VK_PGUP
VK_PGDN
Liang,Introduction to Java Programming,revised by Dai-kaiyu
29
The KeyEvent Class, cont.
java.awt.event.InputEvent
java.awt.event.KeyEvent
+getKeyChar(): char
Returns the character associated with the key in this event.
+getKeyCode(): int
Returns the integer keyCode associated with the key in this event.
Liang,Introduction to Java Programming,revised by Dai-kaiyu
30
Example 12.6
Keyboard Events Demo
Objective: Display
a user-input
character. The user
can also move the
character up, down,
left, and right using
the arrow keys.
KeyboardEventDemo
Liang,Introduction to Java Programming,revised by Dai-kaiyu
Run
31
Optional
The Timer Class
Not all source objects are GUI components. The javax.swing.Timer
class is a source component that fires an ActionEvent at a predefined
rate.
javax.swing.Timer
+Timer(delay: int, listener:
ActionListener)
Creates a Timer with a specified delay in milliseconds and an
ActionListener.
+addActionListener(listener:
ActionListener): void
Adds an ActionListener to the timer.
+start(): void
Starts this timer.
+stop(): void
Stops this timer.
+setDelay(delay: int): void
Sets a new delay value for this timer.
The Timer class can be used to control animations. For example, you
can use it to display a moving message.
AnimationDemo
Liang,Introduction to Java Programming,revised by Dai-kaiyu
Run
32
Clock Animation
In Section 11.12, you drew a StillClock to show the current
time. The clock does not tick after it is displayed. What can
you do to make the clock display a new current time every
second? The key to making the clock tick is to repaint it
every second with a new current time. You can use a timer
to control how to repaint the clock.
ClockAnimation
Liang,Introduction to Java Programming,revised by Dai-kaiyu
Run
33