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