©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event...

40
©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling

Transcript of ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event...

Page 1: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

©2000, John Wiley & Sons, Inc.Horstmann/Java Essentials, 2/e

Chapter 10: Event Handling1

Event Handling

Page 2: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

©2000, John Wiley & Sons, Inc.Horstmann/Java Essentials, 2/e

Chapter 10: Event Handling2

Events

• Mouse move• Key press• Button click• . . .• originate from event source• processed by event listener

Page 3: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

©2000, John Wiley & Sons, Inc.Horstmann/Java Essentials, 2/e

Chapter 10: Event Handling3

Event classes• Event class (e.g. MouseEvent). Contains

information about the event (e.g. mouse location)

• Event listener. Knows what to do when the event occurs. Implements listener interface (e.g. MouseListener)

• Event source. Keeps a list of listeners and notifies them when the event occurs

Page 4: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 4

Figure 1Event Classes

Page 5: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 5

Listening to mouse events

• MouseListener interface has 5 methods– void mouseClicked(MouseEvent e)

– void mouseEntered(MouseEvent e)

– void mouseExited(MouseEvent e)

– void mousePressed(MouseEvent e)

– void mouseReleased(MouseEvent e)

Page 6: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 6

Spying on events

• class MouseSpy implements MouseListener{ public void mouseClicked(MouseEvent e) { System.out.println ("Mouse clicked. x=" + e.getX() + " y=" + e.getY()); }

// same for other 4 listener methods}

Page 7: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 7

Adding the listener

• public class MouseSpyApplet{ public MouseSpyApplet() { MouseSpy listener = new MouseSpy(); addMouseListener(listener); }}

Page 8: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 8

Figure 2Spying on Mouse Events

Page 9: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 9

Event Adapters

• Most mouse listeners only need one or two of the 5 listener methods

• Boring to redefine the others to do nothing• MouseAdapter implements all 5 methods

to do nothing.• Extend MouseAdapter and just override the

methods you need• Other listener interfaces with > 1 method also

have adapters

Page 10: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 10

Move egg to mouse position

• public class EggApplet extends Applet{ public EggApplet() { egg = new Ellipse2D.Double(...); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.draw(egg); } private Ellipse2D.Double egg;}

Page 11: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 11

Add mouse listener

• public EggApplet(){ . . . MouseClickListener listener = new MouseClickListener(); addListener(listener);}

• class MouseClickListener extends MouseAdapter{ public void mouseClicked(MouseEvent e) { // set egg center to // e.getX(), e.getY() }}

Page 12: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 12

Make the listener an inner class• Listener can't access egg instance variable• Make it an inner class• class EggApplet{ . . . private class MouseClickListener extends MouseAdapter { . . . }}

• Inner class methods can access outer class instance variables

Page 13: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 13

Inner classes

• class EggApplet extends Applet{ . . . private class MouseClickListener extends MouseAdapter { public void mouseClicked (MouseEvent e) { int mouseX = e.getX(); int mouseY = e.getY(); egg.setFrame(...); repaint(); } }}

Page 14: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 14

Accessing outer class features

• Inner class has no egg instance variable• Accesses outer class variable• Inner class has no repaint method• Calls outer class method• On which EggApplet instance?• The one that constructed the inner class

object—the inner class object remembers who constructed it

Page 15: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 15

Figure 3An Inner-Class Object Remembersthe Outer-Class Object ThatConstructed It

Page 16: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 16

Program EggApplet.java

import java.applet.Applet;import java.awt.Graphics;import java.awt.Graphics2D; import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.geom.Ellipse2D;

public class EggApplet extends Applet{ public EggApplet() { egg = new Ellipse2D.Double(0, 0, EGG_WIDTH, EGG_HEIGHT);

// add mouse click listener MouseClickListener listener = new MouseClickListener(); addMouseListener(listener); }

Page 17: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 17

public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; g2.draw(egg);}

private Ellipse2D.Double egg;private static final double EGG_WIDTH = 30;private static final double EGG_HEIGHT = 50;

// inner class definition

private class MouseClickListener extends MouseAdapter{ public void mouseClicked(MouseEvent event) { int mouseX = event.getX(); int mouseY = event.getY();

// now move the ellipse to (mouseX, mouseY)

Page 18: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 18

egg.setFrame(mouseX - EGG_WIDTH / 2, mouseY - EGG_HEIGHT / 2, EGG_WIDTH, EGG_HEIGHT); repaint(); } }}

Page 19: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 19

Figure 4Handling Mouse Events

Page 20: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 20

Graphical Applications

• Live inside frame window• Set size and title• Call show method• That ends the main method, but the program

keeps running• GUI thread handles events

Page 21: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 21

Figure 5A Frame Window

Page 22: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 22

Program FrameTest1.java

import javax.swing.JFrame;

public class FrameTest1{ public static void main(String[] args) { EmptyFrame frame = new EmptyFrame(); frame.setTitle("Frame Test"); frame.show(); }}

class EmptyFrame extends JFrame{ public EmptyFrame() { final int DEFAULT_FRAME_WIDTH = 300; final int DEFAULT_FRAME_HEIGHT = 300; setSize(DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT); }}

Page 23: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 23

Quitting Graphical Apps

• Define window closer:class WindowCloser extends WindowAdapter{ public void windowClosing (WindowEvent e) { System.exit(0); }}

• Add as window listener to the frame

Page 24: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 24

Program FrameTest2.java

import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JFrame;

public class FrameTest2{ public static void main(String[] args) { EmptyFrame frame = new EmptyFrame(); frame.setTitle("Close me!"); frame.show(); }}

Page 25: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 25

class EmptyFrame extends JFrame{ public EmptyFrame() { final int DEFAULT_FRAME_WIDTH = 300; final int DEFAULT_FRAME_HEIGHT = 300; setSize(DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT);

WindowCloser listener = new WindowCloser(); addWindowListener(listener); }

private class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent event) { System.exit(0); } }}

Page 26: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 26

Add GUI components

• Panels (for drawing)• Text fields (for text input)• Buttons• Menus

Page 27: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 27

Drawing on a Panel

• public class MyPanel extends JPanel{ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; // your drawing code here }}

Page 28: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 28

Figure 6Anatomy of a Swing Frame

Page 29: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 29

Layout Manager

• Content pane uses the border layout by default

• Container contentPane = getContentPane();contentPane.add(myPanel, "Center");

Page 30: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 30

Figure 7Component Areas of a Border Layout

Page 31: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 31

Text input

• JTextField textField = new JTextField();contentPane.add(textField, "South");

• JTextField generates action events• ActionListener interface has a single

method: actionPerformed

Page 32: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 32

Figure 8A Frame with a Text Field

Page 33: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 33

Processing Text Input

• class TextFieldListener implements ActionListener{ public void actionPerformed (ActionEvent event) { // get user input String input = textField.getText(); // process input . . . // clear text field input.setText(""); }}

Page 34: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 34

Figure 9Drawing Random Eggs

Page 35: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 35

Program Eggs.java

import java.awt.Container;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.geom.Ellipse2D;import java.util.Random; import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;

Page 36: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 36

public class Eggs{ public static void main(String[] args) { EggFrame frame = new EggFrame(); frame.setTitle("Enter number of eggs"); frame.show(); }}

class EggFrame extends JFrame{ public EggFrame() { final int DEFAULT_FRAME_WIDTH = 300; final int DEFAULT_FRAME_HEIGHT = 300; setSize(DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT);

addWindowListener(new WindowCloser());

// construct components

panel = new EggPanel();

Page 37: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 37

textField = new JTextField(); textField.addActionListener(new TextFieldListener());

// add components to content pane

Container contentPane = getContentPane(); contentPane.add(panel, "Center"); contentPane.add(textField, "South");}

private JTextField textField;private EggPanel panel;

private class TextFieldListener implements ActionListener{ public void actionPerformed(ActionEvent event) { // get user input

String input = textField.getText();

// process user input

Page 38: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 38

panel.setEggCount(Integer.parseInt(input));

// clear text field

textField.setText(""); } }

private class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent event) { System.exit(0); } }}

class EggPanel extends JPanel{ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g;

Page 39: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 39

// draw eggCount ellipses with random centers

Random generator = new Random(); for (int i = 0; i < eggCount; i++) { double x = getWidth() * generator.nextDouble(); double y = getHeight() * generator.nextDouble(); Ellipse2D.Double egg = new Ellipse2D.Double(x, y, EGG_WIDTH, EGG_HEIGHT); g2.draw(egg); }}

/** Sets the number of eggs to be drawn and repaints the panel. @param count the new number of eggs*/

Page 40: ©2000, John Wiley & Sons, Inc. Horstmann/Java Essentials, 2/e Chapter 10: Event Handling 1 Event Handling.

From Horstmann/Java Essentials, 2/e 40

public void setEggCount(int count) { eggCount = count; repaint(); }

private int eggCount; private static final double EGG_WIDTH = 30; private static final double EGG_HEIGHT = 50; }