Gestione degli eventi - Politecnico di Torino

Gestione dell’interattività: gli eventi
Gli eventi sono una modalità di comunicazione tra l’utente (sistema) e il programma in esecuzione.
Tipi di eventi:
¯ Input da parte dell’utente:
– pressione del(i) bottone(i) del mouse
– spostamento del mouse
– pressione di un tasto della tastiera
¯ Eventi dell’interfaccia utente:
– click su bottoni
– spostamento di una barra di scorrimento
– visualizzazione di menu
¯ Eventi delle finestre: apertura, chiusura e uscita da una finestra
La gestione degli eventi all’interno di un’applicazione permette di modificare il comportamento della applet (o applicazione) in base alle informazioni fornite dall’utente.
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 1
JAVA
Gestione degli eventi
Le gestione degli eventi nelle versioni piu’ recenti di Java è basata su un modello di delegazione degli eventi e sul
concetto di ascoltatore di eventi, che è responsabile della gestione di eventi specifici.
¯ L’elaborazione degli eventi è separata in due parti:
– l’oggetto su cui è generato l’evento (una applet o una sua parte)
– l’ascoltatore di eventi (che può essere diverso per categorie di eventi diversi) che esegue azioni in risposta
agli eventi specifici di cui si occupa
¯ I due elementi sono collegati mediante la registrazione dell’ascoltatore
µ sono trasmessi all’ascoltatore solo gli eventi che lo interessano
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 2
JAVA
Gestione degli eventi per Java
Applet
Evento:
tasto premuto
init()
... iniz. applet
... registra ascoltatore
mouse
...
Evento:
pulsante mouse
premuto
Ascoltatore mouse
Evento:
spostamento
mouse
Ascoltatore spost.
mouse
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 3
JAVA
Gestione degli eventi
Per gestire gli eventi è necessario eseguire le seguenti operazioni:
1. Decidere quali eventi devono essere gestiti dalla applet e individuare gli ascoltatori appropriati
2. Definire il codice per l’elaborazione degli eventi degli ascoltatori
¯ Un gestore di eventi è una classe che implementa una o più interfacce di ascoltatori
¯ Due possibilità:
(a) creazione di una classe di gestione degli eventi separata
(b) introduzione della gestione degli eventi nella applet
3. Registrare l’ascoltatore con il ricevitore degli eventi (esempio: la applet)
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 4
JAVA
Individuazione degli eventi
I diversi ascoltatori sono definiti dalle interfacce contenute nel package java.awt.event
Interfaccia
MouseListener
Eventi
Pulsante premuto
Pulsante rilasciato
Ingresso cursore mouse
Uscita cursore mouse
Click mouse
MouseMotionListener Movimento del mouse
Drag del mouse
KeyListener
Tasto premuto
Tasto rilasciato
Tasto digitato
Metodo
public void mousePressed(MouseEvent e)
public void mouseReleased(MouseEvent e)
public void mouseEntered(MouseEvent e)
public void mouseExited(MouseEvent e)
public void mouseClicked(MouseEvent e)
click = press release nella stessa posizione
public void mouseMoved(MouseMotionEvent e)
public void mouseDragged(MouseMotionEvent e)
public void keyPressed(KeyEvent e)
public void keyReleased(KeyEvent e)
public void keyTyped(KeyEvent e)
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 5
JAVA
Creazione di una classe di ascolto separata
¯ Si definisce la nuova classe come sottoclasse di un adattatore di eventi
– classi definite in java.awt.event; ne esiste una per ogni interfaccia di ascoltatore
¯ Per mouse e tastiera sono disponibili tre adattatori:
MouseAdapter
implementa MouseListener
MouseMotionAdapter implementa MouseMotionListener
KeyAdapter
implementa KeyListener
¯ Esempio:
import java.awt.event.*;
class MyMouseListenerClass extends MouseAdapter {
public void mousePressed(MouseEvent e) {
// istruzioni per la gestione della pressione del pulsante del mouse
}
public void mouseReleased(MouseEvent e) {
// istruzioni per la gestione del rilascio del pulsante del mouse
}
}
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 6
JAVA
Gestione degli eventi nella applet
Si modifica la applet eseguendo i seguenti passi:
¯ Si importa java.awt.event
¯ Si specifica (parola chiave implements) quali interfacce per la gestione di eventi saranno implementate
public class MyApplet extends java.applet.Applet
implements MouseListener {
...
}
¯ Si definiscono tutti i metodi di ciascuna interfaccia (per i metodi che non interessano, si deve specificare il metodo
con il corpo vuoto)
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
// istruzioni per la gestione della pressione del mouse
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 7
JAVA
Registrazione dell’ascoltatore
¯ Si utilizzano metodi speciali definiti nella classe Component
¯ Per ogni tipo di ascoltatore esiste il corrispondente metodo (esempi: addMouseListener(),
addMouseMotionListener(), addKeyListener())
– se è stata definita una classe di gestione degli eventi separata:
ml = new MiaClasseDiAscoltoMouse();
addMouseListener(ml);
– se è stata introdotta la gestione degli eventi nella applet
addMouseListener(this);
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 8
JAVA
Gestione del mouse
¯ Gli eventi del mouse appartengono alle classi MouseEvent e MouseMotionEvent, che sono sottoclassi di
InputEvent
¯ Le interfacce degli ascoltatori sono definite in MouseListener e MouseMotionListener
¯ La pressione del bottone del mouse genera due eventi:
– mousePressed() quando il bottone è premuto
– mouseReleased() quando il bottone è rilasciato
– mouseClicked() quando il bottone è premuto e rilasciato nella medesima posizione
¯ Quando il mouse si sposta vengono generati una serie di eventi a tale spostamento:
– mouseMoved(): movimento normale del mouse
– mouseDragged(): movimento del mouse con il bottone premuto
– mouseEntered()/mouseExited(): il mouse entra/esce nello spazio di schermo dedicato alla applet
¯ Per conoscere la posizione del mouse si utilizzano i metodi getX() e getY() definiti sull’oggetto evento
¯ Per gestire doppio e triplo click, si utilizza il metodo getClickCount() definito nella classe MouseEvent
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 9
JAVA
La applet Spots
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.*;
public void paint(Graphics g) {
g.setColor(Color.blue);
for (int i = 0; i < currspots; i++) {
g.fillOval(xspots[i]-10,
yspots[i] -10,20,20);
}
}
public class Spots
extends java.applet.Applet
implements MouseListener
{
final int MAXSPOTS = 10;
int xspots[] = new int[MAXSPOTS];
int yspots[] = new int[MAXSPOTS];
int currspots = 0;
public void mousePressed(MouseEvent e) {
if (currspots < MAXSPOTS)
addspot(e.getX(),e.getY());
else
System.out.println("Too many spots.");
}
public void init() {
setBackground(Color.white);
addMouseListener(this);
}
void addspot(int x,int y) {
xspots[currspots] = x;
yspots[currspots] = y;
currspots++;
repaint();
}
public
public
public
public
void
void
void
void
mouseClicked(MouseEvent e) {}
mouseReleased(MouseEvent e) {}
mouseEntered(MouseEvent e) {}
mouseExited(MouseEvent e) {}
}
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 10
JAVA
La applet Spots
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 11
JAVA
La applet Lines
import java.awt.*;
import java.awt.event.*;
void addline(int x,int y) {
Point stmp[];
Point etmp[];
if (currline % 10 == 0) { // grow the arrays
stmp = new Point[currline + 10];
etmp = new Point[currline + 10];
System.arraycopy(starts,0,stmp,0,starts.length);
System.arraycopy(ends, 0, etmp, 0, ends.length);
starts = stmp;
ends = etmp;
}
starts[currline] = anchor;
ends[currline] = new Point(x,y);
currline++;
currentpoint = null;
repaint();
}
public void paint(Graphics g) {
for (int i = 0; i < currline; i++) {
//Existing lines
g.drawLine(starts[i].x, starts[i].y,
ends[i].x, ends[i].y);
}
if (currentpoint != null) {
g.setColor(Color.blue);
// Current line
g.drawLine(anchor.x,anchor.y,
currentpoint.x,currentpoint.y);
}
}
public class Lines extends java.applet.Applet
implements MouseListener,MouseMotionListener {
Point starts[] = new Point[10]; // starting points
Point ends[] = new Point[10];
// ending points
Point anchor;
// start of current line
Point currentpoint;
// current end of line
int currline = 0;
// number of lines
public void init() {
setBackground(Color.white);
addMouseListener(this);
addMouseMotionListener(this);
}
public void mouseMoved(MouseEvent e) { }
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) {
anchor = new Point(e.getX(),e.getY());
}
public void mouseReleased(MouseEvent e) {
addline(e.getX(),e.getY());
}
public void mouseDragged(MouseEvent e) {
currentpoint = new Point(e.getX(),e.getY());
repaint();
}
}
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 12
JAVA
La applet Lines
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 13
JAVA
Gestione della tastiera
¯ Gli eventi della tastiera appartengono alla classe KeyEvent, sottoclasse di InputEvent
¯ L’interfaccia dell’ascoltatore è definita in KeyListener
¯ Per gli eventi generati dalla tastiera sono definiti i metodi:
– keyPressed(): un tasto è stato premuto
– keyReleased(): un tasto è stato rilasciato
– keyTyped(): corrisponde alla digitazione di un carattere (un tasto è stato premuto e rilasciato)
¯ I tasti modificatori sono verificati con i metodi isShiftDown(), isControlDown(), isAltDown() e
isMetaDown() definiti nella classe KeyEvent, che ritornano un valore booleano
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 14
JAVA
Gestione della tastiera
¯ Per gestire tasti speciali (esempio: tasti funzione, PgUp) si utilizzano i tasti virtuali, variabili di classe definite
nella classe KeyEvent
µ permettono di rendere indipendente il codice Java dalla piattaforma (tastiere diverse possono generare valori
numerici diversi per lo stesso tasto)
¯ È possibile verificarli utilizzando il metodo getKeyCode() definito nella classe KeyEvent:
if (e.getKeyCode() == KeyEvent.VK_PAGE_DOWN) {
// istruzioni gestione tasto PgDn
}
¯ Alcuni dei tasti speciali definiti:
Variabile di classe
VK HOME
VK END
VK PAGE UP
VK PAGE DOWN
VK F1 – VK F12
VK PAUSE
Tasto rappresentato
Home
End
Page Up
Page Down
Tasti funzione
Tasto pausa
Variabile di classe
VK UP
VK DOWN
VK LEFT
VK RIGHT
VK INSERT
VK ESCAPE
Tasto rappresentato
Freccia in su
Freccia in giù
Freccia a sinistra
Freccia a destra
Insert
Escape
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 15
JAVA
La applet Keys
import java.awt.*;
import java.awt.event.*;
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
curry += 5;
break;
case KeyEvent.VK_UP:
curry -= 5;
break;
case KeyEvent.VK_LEFT:
currx -= 5;
break;
case KeyEvent.VK_RIGHT:
currx += 5;
break;
default:
currkey = e.getKeyChar();
}
repaint();
}
public class Keys
extends java.applet.Applet
implements KeyListener {
char currkey;
int currx;
int curry;
public void init() {
currx = (this.getSize().width / 2) - 8;
curry = (this.getSize().height / 2) - 16;
setBackground(Color.white);
setFont(new Font("Helvetica",Font.BOLD,36));
addKeyListener(this);
}
public void paint(Graphics g) {
if (currkey != 0) {
g.drawString(String.valueOf(currkey),
currx, curry);
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
Elena Baralis, Andrea Bianco, Maurizio Munaf ò
Politecnico di Torino
JAVA: GESTIONE DEGLI EVENTI – 16
JAVA
JAVA