Event Handling and Anonymous Classes in Java, Lecture notes of Object Oriented Programming

The concept of event handling in java, with a focus on listening to events such as mouse clicks, mouse movements, and keystrokes. It covers the use of inner and anonymous classes, and the implementation of listener methods. Examples are provided to illustrate the concepts.

Typology: Lecture notes

2012/2013

Uploaded on 08/20/2013

yumni
yumni 🇮🇳

5

(2)

25 documents

1 / 21

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
12. Listening to events. Inner and anonymous classes
Why men think computer
should be a feminine word
1. No one but their creator
understands their internal logic.
2. The native language they use
to talk with other computers is
incomprehensible to everyone
else.
3. Even the smallest mistakes
are stored in long term memory
for possible later retrieval.
4. As soon as you commit to
one, half your paycheck goes for
accessories for it.
Why women think computer
should be a masculine word
1. In order to do anything with
them, you have to turn them on.
2. They have a lot of data but
still can't think for themselves.
3. They are supposed to help
you solve problems, but half
the time they ARE the problem.
4. As soon as you commit to
one, you realize that if you had
waited a little longer, you could
have gotten a better model.
docsity.com
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15

Partial preview of the text

Download Event Handling and Anonymous Classes in Java and more Lecture notes Object Oriented Programming in PDF only on Docsity!

12. Listening to events. Inner and anonymous classes

Why men think “computer” should be a feminine word

  1. No one but their creator understands their internal logic.
  2. The native language they use to talk with other computers is incomprehensible to everyone else.
  3. Even the smallest mistakes are stored in long term memory for possible later retrieval.
  4. As soon as you commit to one, half your paycheck goes for accessories for it.

Why women think “computer” should be a masculine word

  1. In order to do anything with them, you have to turn them on.
  2. They have a lot of data but still can't think for themselves.
  3. They are supposed to help you solve problems, but half the time they ARE the problem.
  4. As soon as you commit to one, you realize that if you had waited a little longer, you could have gotten a better model.

Prelim: Thursday, 7 March: 7:30–9:00. Place: TBA Makeup for those with approved conflicts: 5:30-7:00. Place: TBA Can’t make either? Contact Prof. Birman. Review sessions: Sunday, 3 March: 1-3PM and 3-5PM, Olin 155

Summary of what exam covers: Basically, everything before GUIs (i.e. before this week) More detail will be provided in a document to be this evening on the course website and Piazza.

Previous exams: On course website (click “Exams”)

Note: Today’s slides have been updated since posting on course website. Today’s version will be put on website this afternoon.

A1. 164 graded. 40 got 100. mean 92.3, median 94, stdev. 7.

What is a JButton?

Instance: associated with a “button” on the GUI,

which can be clicked to do something

jb1= new JButton() // jb1 has no text on it jb2= new JButton(“first”) // jb2 has label “first” on it

jb2.isEnabled() // true iff a click on button can be // detected jb2.setEnabled(b); // Set enabled property

jb2.addActionListener(object); // object must have a method, // which is called when button jb2 clicked (next page)

At least 100 more methods; these are most important

JButton is in package javax.swing

Listening to a JButton

  1. Implement interface ActionListener: public class C extends JFrame implements ... ActionListener { }
  2. In class C override actionPerformed, which is to be called when button is clicked: /** Process click of button */ public void actionPerformed(ActionEvent e) { ... }
  3. Add an instance of class C an “action listener” for button: button.addActionListener( this );

A JPanel that is painted

  • The JFRame content pane has a JPanel in its CENTER and a “reset” button in its SOUTH.
  • The JPanel has a horizontal box b, which contains two vertical Boxes.
  • Each vertical Box contains two instances of class Square.
  • Click a Square that has no pink circle, and a pink circle is drawn. Click a square that has a pink circle, and the pink circle disappears. Click the rest button and all pink circles disappear.
  • This GUI has to listen to: (1) a click on Button reset (2) a click on a Square (a Box)

these are different kinds of events, and they need different listener methods

Class Square

/** Instance: JPanel of size (WIDTH, HEIGHT). Green or red: / public class Square extends JPanel { public static final int HEIGHT= 70; public static final int WIDTH= 70; private int x, y; // Panel is at (x, y) private boolean hasDisk= false ; /* Const: square at (x, y). Red/green? Parity of x+y. / public Square( int x, int y) { this .x= x; this .y= y; setPreferredSize( new Dimension(WIDTH,HEIGHT)); } /* Complement the "has pink disk" property */ public void complementDisk() { hasDisk=! hasDisk; repaint(); // Ask the system to repaint the square }

continued on later

Class Square

/** Remove pink disk (if present) */ public void clearDisk() { hasDisk= false ; // Ask system to // repaint square repaint(); }

continuation of class Square

/* paint this square using g. System calls paint whenever square has to be redrawn.*/ public void paint(Graphics g) { if ((x+y)%2 == 0) g.setColor(Color.green); else g.setColor(Color.red); g.fillRect(0, 0, WIDTH-1, HEIGHT-1); if (hasDisk) { g.setColor(Color.pink); g.fillOval(7, 7, WIDTH-14, HEIGHT-14); } g.setColor(Color.black); g.drawRect(0, 0, WIDTH-1,HEIGHT-1); g.drawString("("+x+", "+y+")", 10, 5+HEIGHT/2); } }

Listen to mouse event

(click, press, release, enter, leave on a

public interface MouseListener {^ component)

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

In package java.awt.event

Having to write all of these in a class that implements MouseListener, even though you don’t want to use all of them, can be a pain. So, a class is provided that implements them in a painless.

Javax.swing.event.MouseInputAdapter implements MouseListener

DemoMouseEvents() { …

… }

DemoMouseEvents

a

JFrame

dma a1 lab1 … lab1 …

lab1.addMouseListener(dma);

mouseClicked() mouseEntered() mouseExited() mousePressed() mouseReleased()

MIA

a

mouseClicked() {

}

MouseEvents

MouseListener

A class that listens to a mouseclick in a Square

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

/** Contains a method that responds to a mouse click in a Square */ public class MouseEvents extends MouseInputAdapter { // Complement "has pink disk" property public void mouseClicked(MouseEvent e) { Object ob= e.getSource(); if (ob instanceof Square) { ((Square)ob).complementDisk(); } } }

This class has several methods (that do nothing) that process mouse events: mouse click mouse press mouse release mouse enters component mouse leaves component mouse dragged beginning in component Our class overrides only the method that processes mouse clicks

red: listening blue: placing

Listening to the keyboard

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

public class AllCaps extends KeyAdapter { JFrame capsFrame= new JFrame(); JLabel capsLabel= new JLabel(); public AllCaps() { capsLabel.setHorizontalAlignment(SwingConstants.CENTER); capsLabel.setText(":)"); capsFrame.setSize(200,200); Container c= capsFrame.getContentPane(); c.add(capsLabel); capsFrame.addKeyListener( this ); capsFrame.show(); } public void keyPressed (KeyEvent e) { char typedChar= e.getKeyChar(); capsLabel.setText(("'" + typedChar + "'").toUpperCase()); } }

  1. Extend this class.
  2. Override this method. It is called when a key stroke is detected.
  3. Add this instance as a key listener for the frame

red: listening blue: placing

public class BDemo3 extends JFrame implements ActionListener { private JButton wButt, eButt …; public ButtonDemo3() { Add buttons to content pane, enable ne, disable the other wButt.addActionListener( this ); eButt.addActionListener( new BeListener()); } public void actionPerformed(ActionEvent e) { boolean b= eButt.isEnabled(); eButt.setEnabled(!b); wButt.setEnabled(b); } }

class BeListener implements ActionListener { public void actionPerformed(ActionEvent e) { boolean b= eButt.isEnabled(); eButt.setEnabled(!b); wButt.setEnabled(b); }

A listener for eastButt

Doesn’t work! Can’t reference eButt, wButt

Have a different listener for each button

Problem: can’t give a function as a parameter: public void m() { … eButt.addActionListener(aP); } public void aP(ActionEvent e) { body }

Why not just give eButt the function to call? Can’t do it in Java! Can in some other languages

public void m() { … eButt.addActionListener( new C()); }

public class C implements IN { public void aP(ActionEvent e) { body } }

Java says: provide class C that wraps method; give eButt an object of class C

C must implement interface IN that has abstract method aP

Have a class for which only one object is created? Use an anonymous class. Use sparingly, and only when the anonymous class has 1 or 2 methods in it, because the syntax is ugly, complex, hard to understand.

public class BDemo3 extends JFrame implements ActionListener { private JButton wButt, eButt …; public ButtonDemo3() { … eButt.addActionListener( new BeListener()); } public void actionPerformed(ActionEvent e) { … } private class BeListener implements ActionListener { public void actionPerformed(ActionEvent e) { body } } } 1 object of BeListener created. Ripe for making anonymous