95-712 oop java1 event handling overview listeners, adapters and event sources inner classes event...

49
95-712 OOP Java 1 Event Handling Overview Listeners, Adapters and Event Sources Inner classes Event Handling Details Applets and GUI Applications Event Handling

Post on 21-Dec-2015

224 views

Category:

Documents


0 download

TRANSCRIPT

95-712 OOP Java 1

• Event Handling Overview• Listeners, Adapters and Event Sources• Inner classes• Event Handling Details• Applets and GUI Applications

Event Handling

95-712 OOP Java 2

Event Handling

• Used by the Abstract Window Toolkit (AWT) – for basic GUI programming Java 1.0• Used by Swing -- Better components than AWT Java 2• Used by JavaBeans -- reusable software components, like Visual Basic, that can be manipulated in a builder tool

95-712 OOP Java 3

Babysitting

A baby in the home needs attention.Many events surrounding the baby are not easily ignored.Events can be of different types.

95-712 OOP Java 4

One possible source of events

95-712 OOP Java 5

Babysitting

Before responding to an event, a babysitter typically takes noteof the source and the type of event.

95-712 OOP Java 6

Babysitting

The sitter needs to know both the event type and the event source.

Event source

Event type

Handler

95-712 OOP Java 7

Event Handling

The window manager software may generate hundreds of differentevents.

Examples include mouse clicks, mouse movements, key strokes,and timer ticks.

A programmer is typically interested in a small subset of all of the possible events that may occur.

95-712 OOP Java 8

Events and Event Objects

• Since events may be of different types but still exhibit some shared traits (inheritance) Java represents the event classes in a hierarchy.

• The root class is called java.util.EventObject. The only common feature shared by all events is a source object. So we find the following method in the EventObject class :

public Object getSource();

95-712 OOP Java 9

EventObject

AWTEvent

ActionEvent ComponentEvent

InputEvent WindowEvent

MouseEvent KeyEvent

Some classes andmethods in the eventhierarchy.

Object

String getActionCommand()

int getX()char getKeyChar()

boolean isAltDown() Window getWindow()

95-712 OOP Java 10

Event handling usually involves three types of objects

• Objects are used to hold and report on information about the event.• Objects are typically the source of events.• Objects, called listeners, are used to handle events.

95-712 OOP Java 11

ExampleA mouseobject

A mouseobject

An event object that describes, say, the x and y coordinate of where the mouse was clicked

An event object that describes, say, the x and y coordinate of where the mouse was clicked

The listener object has methods that are called for particular events

The listener object has methods that are called for particular events

Event Source

Event data and methods

Listener

95-712 OOP Java 12

ExampleA mouseobject

A mouseobject

An event object that describes, say, the x and y coordinate of where the mouse was clicked

An event object that describes, say, the x and y coordinate of where the mouse was clicked

The listener object has methods that are called for particular events

The listener object has methods that are called for particular events

ImplementsMouseListener

The event object is sentto a listener method

A mouse object mustbe told who its listener is.

95-712 OOP Java 13

The Listener

There are different types of Listeners.

MouseListenersWindowListenersScrollBarListenersEtc..

These Listeners are interfaces. Remember what an interfaceprovides? If class X implements an interface then class X promisesto provide (at least) the methods declared in the interface.

95-712 OOP Java 14

Some of the Listener Hierarchy

EventListener

ActionListener

abstract void actionPerformed(ActionEvent e);

MouseListener

abstract void mouseClicked(MouseEvent e)

KeyListener

95-712 OOP Java 15

A Listener Interface

public interface MouseListener {

void mouseClicked(MouseEvent e); void mouseEntered(MouseEvent e); void mouseExited(MouseEvent e); void mouseReleased(MouseEvent e);

}

//What does it mean if I claim that I implement this interface?

95-712 OOP Java 16

An Example

// MouseSpyApplet.java

import java.applet.Applet;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;

95-712 OOP Java 17

class MouseSpy implements MouseListener{ public void mouseClicked(MouseEvent event) { System.out.println("Mouse clicked. x = " + event.getX() + " y = " + event.getY()); } public void mouseEntered(MouseEvent event) { System.out.println("Mouse entered. x = " + event.getX() + " y = " + event.getY()); } public void mouseExited(MouseEvent event) { System.out.println("Mouse exited. x = " + event.getX() + " y = " + event.getY()); } public void mousePressed(MouseEvent event) { System.out.println("Mouse pressed. x = " + event.getX() + " y = " + event.getY()); } public void mouseReleased(MouseEvent event) { System.out.println("Mouse released. x = " + event.getX() + " y = " + event.getY()); }}

I have to provideALL of these methods!!

95-712 OOP Java 18

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

95-712 OOP Java 19

<html><head></body></head><B>Spying on the mouse</b><p><applet code="MouseSpyApplet.class" width=400 height=200></applet>

</html>

Java Applets need an HTML file.

95-712 OOP Java 20

Another approachSuppose a friendly sole created this class:

public class MouseAdapter implements MouseListener { void mouseClicked(MouseEvent e){} void mouseEntered(MouseEvent e){} void mouseExited(MouseEvent e){} void mousePressed(MouseEvent event) {} void mouseReleased(MouseEvent e){}}

Now, suppose I extend this class. What must I provide?

95-712 OOP Java 21

Only those methods that I am interested in.

The other methods, when called, do nothing. We’ll visit this issue again later.

95-712 OOP Java 22

Inner Classes

• Nested Top Level Classes (not inner)

• Member Classes

• Local Classes

• Anonymous Classes

95-712 OOP Java 23

Nested Top Level Class

• Nested top-level classes are not inner classes.• Use as a convenient way to group related classes• Since the class must be static and has no 'this' pointer, it has no access to the instance data of objects for its enclosing class.• It behaves just like a 'normal' class or interface.

95-712 OOP Java 24

//NestedTopLevelExample.java

class Top { int i,j; static class SomeClass { // static makes it top-level nested int k; SomeClass() { System.out.println("Constructing SomeClass"); } void foo() { System.out.println("Hello"); } } Top() { System.out.println("Constructing a Top object"); }

}

95-712 OOP Java 25

public class NestedTopLevelExample {

public static void main(String args[]) {

Top myTop = new Top();

Top.SomeClass myObject = new Top.SomeClass(); myObject.foo(); }}

Output

Constructing a Top objectConstructing SomeClassHello

95-712 OOP Java 26

Member Classes (1)

• Member classes (there is no such thing as a 'member‘ interface)• This inner class (it's not a top-level class) has no static keyword and can access the members of each object of its outer class.• The class 'appears in every instance'.

95-712 OOP Java 27

•The parent class must declare an instance of an inner class, before it can invoke the inner class methods, assign to data fields (including private ones), and so on.

•Unlike nested top-level classes, inner classes are not directly part of a package and are not visible outside the class in which they are nested.

• Inner classes are often used for GUI event handlers.

Member Classes (2)

95-712 OOP Java 28

// MemberClassExample.javaclass Top { int i = 33; public class SomeClass { // access the outer object's state. private int k = i; SomeClass() { System.out.println("Constructing SomeClass"); } void foo() { System.out.println("Hello"); } } Top() { System.out.println("Constructing a Top object"); SomeClass sc = new SomeClass(); System.out.println(sc.k); }}

95-712 OOP Java 29

public class MemberClassExample {

public static void main(String args[]) {

Top myObject = new Top(); }}

// OUTPUTConstructing a Top objectConstructing SomeClass33

95-712 OOP Java 30

Local Classes

•A local class is an inner class. Typically, a local class is declared within a method. It is not a member of an enclosing class. It is visible only within a block.

•These classes are used primarily as "adapter classes".

• For example, a block of code that creates a Button object could use a local class to define a simple implementation of the ActionListener Interface. Then it could instantiate this simple implementation and pass the resulting object to the button's ActionListener method, thereby connecting the button to the "callback" code that is executed when the button is pressed.

95-712 OOP Java 31

// Local Class exampleclass Top { int i = 33; Top() { System.out.println("Constructing a Top object"); // define a class within a method class Wow { int t; Wow() { System.out.println("Building a Wow"); i = 8; t = 9; } } Wow h = new Wow(); System.out.println(" h.t == " + h.t); System.out.println(" i == " + i); }}

95-712 OOP Java 32

public class LocalExample {

public static void main(String args[]) {

Top myObject = new Top(); }}

// OUTPUT

Constructing a Top objectBuilding a Wow h.t == 9 i == 8

95-712 OOP Java 33

• An anonymous class is refinement of inner classes.• It allows you to combine the definition of the class with the instance allocation.• Since it is instantiated in the same expression that defines it, it can only be instantiated once. This is very similar to local classes. • When writing a simple adapter class, the choice between a named local class and an unnamed anonymous class typically comes down to a matter of style and code clarity, rather than any difference in functionality.•The new class can't have a constructor.

Anonymous Classes

95-712 OOP Java 34

// Anonymous.java

interface SmallClass { public void foo();}

class Top { int i = 33; void someMethod(SmallClass s) { s.foo(); } void anotherMethod() { someMethod(new SmallClass() { public void foo() { System.out.println("Really fun"); } }); }

95-712 OOP Java 35

Top() { System.out.println("Constructing a Top object"); someMethod(new SmallClass() { public void foo() { System.out.println("Strange but fun"); } }); }}

95-712 OOP Java 36

public class Anonymous {

public static void main(String args[]) {

// We can't create interface objects // error: SmallClass s = new SmallClass();

Top myObject = new Top(); myObject.anotherMethod(); }}// OUTPUTConstructing a Top objectStrange but funReally fun

95-712 OOP Java 37

Event Handling – Details

register Source Object Listener Object

fire events

After the listener object registers itself with the sourceobject, the source object calls a method found in thelistener object and passes an object that describes the event.

Event object

95-712 OOP Java 38

Event Handling

Suppose we have a Button object Button b = new Button();

We must determine what events a particular component generates.

A Button component may generate an ActionEvent object.

Button b

ActionEventObject

ActionEventObject

95-712 OOP Java 39

Implementing a Listener

class BabySitter implements ActionListener { public void actionPerformed(ActionEvent e) { // handle the event object e in some way }}

•We need an object that will listen for the ActionEvent.•We implement the ActionListener class (this class listens for ActionEvents from buttons, menus, etc.) and override its actionPerformed method.

95-712 OOP Java 40

Create a BabySitter object

BabySitter sitter = new BabySitter();

sitter

95-712 OOP Java 41

Registering The Listener

• We want to listen for the ActionEvent object coming from the button.

• So, we tell the button what object will listen for the ActionEvent object:

• b.addActionListener(sitter)

95-712 OOP Java 42

The button and its listener

Button Object Sitter Object

The button calls the actionPerformed()method of the sitter objectand passes an ActionEvent objectas a parameter

addActionListener

95-712 OOP Java 43

Hit the X and the program exits

Once again but with a window

95-712 OOP Java 44

Create a WindowCloseSitter Class

import javax.swing.*;import java.awt.event.*;

public class CloseDemo { public static void main(String[] args) { JFrame f = new JFrame("Example"); f.setSize(400,100); f.setVisible(true); WindowCloseSitter h = new WindowCloseSitter(); f.addWindowListener(h); }}

95-712 OOP Java 45

class WindowCloseSitter implements WindowListener {

public void windowClosing(WindowEvent e) { System.exit(0); } public void windowClosed(WindowEvent e) { } public void windowOpened(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowActivated(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { }

}

But we have to implement ALL of the functions !!

95-712 OOP Java 46

Java Provides Adapter Classes

• ComponentAdapter• MouseMotionAdapter• WidowAdapter• ContainerAdapter• MouseAdapter• FocusAdapter• KeyAdapter

95-712 OOP Java 47

The WindowAdapter class

public abstract class WindowAdapter implements WindowListener {

public void windowClosing(WindowEvent e) {} public void windowClosed(WindowEvent e) { } public void windowOpened(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowActivated(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { }}

A built in class -- we already have the empty bodies!!

95-712 OOP Java 48

The Window again

import javax.swing.*;import java.awt.event.*;public class CloseDemo2 extends WindowAdapter { public static void main(String[] args) { JFrame f = new JFrame("Example"); f.setSize(400,100); f.setVisible(true); f.addWindowListener(new CloseDemo2()); } public void windowClosing(WindowEvent e) { System.exit(0); }}

95-712 OOP Java 49

Again with anonymous classes

import javax.swing.*;import java.awt.event.*;public class CloseDemo3 { public static void main(String[] args) { JFrame f = new JFrame("Example"); f.setSize(400,100); f.setVisible(true); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); } }