interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a...

36
interfacce ed eventi intercettare il mouse ed altri eventi

Transcript of interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a...

Page 1: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

interfacce ed eventi

intercettare il mouse ed altri eventi

Page 2: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-032

interfacce: premessa…

il termine "interfaccia" occorre in Java con due significati, collegati ma distinti

1. interface, parola chiave di Java e strumento di programmazione che viene introdotto in queste trasparenze

2. parte o totalità dell'interfaccia utente, detta anche GUI (Graphical User Interface)per costruire GUI occorre usare le interface

Page 3: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-033

interfaccia Java

elenco di metodi pubblici che il progettista di una classe può impegnarsi a realizzare (implementare)in caso di impegno è obbligatorio realizzare tutti i metodi previstiper ciascun metodo è definita la firma (signature)

– nome– tipo restituito– numero e tipo di parametri

le interfacce possono essere usate come tipi (polimorfismo)

Page 4: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-034

sintassi interfaccia

public interface <nomeInterfaccia> {

<firmaDiMetodo>;

<firmaDiMetodo>;

}

non c’è bisogno di premettere alla firme dei metodi lo specificatore di accesso, poiché tutti i metodi sono automaticamente publicnelle API Java le interfacce sono elencate in corsivo

Page 5: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-035

implementare un’interfaccia

una classe che implementa un’interfaccia ne realizza tutti i metodi, rispettando le firmesi dichiara l’impegno a realizzare i metodi di un’interfaccia scrivendopublic class <nomeC> implements<nomeI> {…}

in caso di impegno non rispettato il compilatore segnalerà errore

Page 6: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-036

esempio: l’interfaccia shape

consente il funzionamento dei metodi draw e fill di Graphics2D

firma di draw: void draw(Shape s)

draw disegnerà qualunque istanza di una qualunque classe che implementi l’interfaccia Shape

– le classi per oggetti grafici, come Rectangle2D.Double, Ellipse2D.Double, Line2D.Double e molte altre, implementano Shape

situazione simile per fill

Page 7: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-037

eventi

azioni sulla tastiera, azioni con il mouse, generano eventi, ovvero fatti che potrebbero interessare il programma in esecuzione

– sono eventi relativi alla GUIesempio: ad ogni piccolo spostamento del mouse il gestore delle finestre invia una comunicazione al programma in esecuzione per notificare l’evento (il piccolo spostamento)

– gli eventi notificati a un programma sono spesso centinaia o migliaia

Page 8: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-038

eventi /2

per ogni tipologia interessante di evento esiste una classe Java corrispondente– MouseEvent eventi relativi ad azioni svolte col

mouse (movimento, pressione/rilascio tasti)– ActionEvent eventi relativi ad azioni di più alto

livello concettuale come pressione del tasto INVIO, clic su un pulsante ecc.

– WindowEvent eventi relativi alle finestre come iconizzazione, chiusura, attivazione, apertura ecc.

Page 9: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-039

eventi /3

i programmi non “ascoltano” le notifiche di eventi, a meno che non abbiano installati appositi ricevitori(listener)ogni ricevitore è istanza di una classe che deve implementare una specifica interfaccia, che dipende dalla natura dell’evento

– le interfacce sono predefinite, mentre l’implementazione dei metodi è a carico del programmatore

– tali metodi specificano il comportamento del programma alla ricezione dell’evento

l’installazione di un ricevitore viene fatta esplicitamente tramite un’apposita chiamata

Page 10: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0310

ricevere eventi /1

1. occorre in pratica identificare tre ingredientia) l’origine dell’evento

– dove può verificarsi l’evento? ad es., in un’applet, in un campo di testo, su un pulsante, su un menu ecc.

b) l’interfaccia che deve essere implementata dalla classe che istanzia i ricevitori per l’evento– dipende dalla natura dell’evento (segue tabella estratta dal

tutorial di Java)– va importata (java.awt.event.<interfaccia>)

c) la classe evento– dipende dalla natura dell’evento– va importata (java.awt.event.<classeEvento>)

Page 11: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0311

tabella interfacce

ListSelectionListener Table or list selection changes

FocusListener Component gets the keyboard focus

ComponentListener Component becomes visible

MouseMotionListener User moves the mouse over a component

MouseListener User presses a mouse button while the cursor is over a component

WindowListener User closes a frame (main window)

ActionListener User clicks a button, presses Return while typing in a text field, or chooses a menu item

Listener type Act that results in the event

Page 12: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0312

ricevere eventi /2

2. definire la classe che implementa l’interfaccia identificata

a) prendere atto di quali sono i metodi da implementare (imposti dall’interfaccia)

b) capirne il significato (ogni metodo descrive il comportamento del programma in corrispondenza di uno specifico evento)

c) implementare i metodi, sfruttando eventualmente la classe evento individuata– i metodi di MouseEvent getX() e getY() consentono di

ottenere le coordinate di pixel del punto in cui si è verificatol’evento

Page 13: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0313

ricevere eventi /3

3. istanziare ed installare un oggetto ricevitore<nomeClasseRicevitore>

listener = new <nomeClasseRicevitore>();

addMouseListener(listener);

oppureaddActionListener(listener);

(o altre tipologie)– tale codice va inserito in fase di inizializzazione della

componente (applet)

Page 14: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0314

interfaccia MouseListener

1. void mousePressed(MouseEvent event);chiamato quando un pulsante del mouse viene premuto su un componente (applet)

2. void mouseReleased(MouseEvent event);chiamato quando un pulsante del mouse viene rilasciato su un componente (applet)

3. void mouseClicked(MouseEvent event);chiamato quando un pulsante del mouse è stato premuto e rilasciato i rtapida successione su un componente (applet)

4. void mouseEntered(MouseEvent event);chiamato quando il mouse entra in un componente (applet)

5. void mouseExited(MouseEvent event);chiamato quando il mouse esce da un componente (applet)

Page 15: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0315

esempio: intercettare i clic del mouse su un’applet

origine evento: applet MouseSpyAppletinterfaccia da implementare: MouseListenerclasse evento rilevante: MouseEventclasse da realizzare, che implementa MouseListener: MouseSpy

Page 16: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 200316

classe MouseSpy

public 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()); }}

Page 17: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0317

applet MouseSpyApplet

import java.applet.Applet;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

public class MouseSpyApplet extends Applet{

public void init() {

MouseSpy listener = new MouseSpy();

addMouseListener(listener); }

} run

Page 18: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0318

interfaccia ActionListener

1. void actionPerformed(ActionEvent e)chiamato quando si verifica un'azione

(alcune) azioni interessanti:– l'utente preme un pulsante sulla GUI (Graphic

User Interface)– l'utente preme il tasto INVIO su un campo di testo

Page 19: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 200319

classe java.awt.TextField

consente di istanziare campi di testo, ovvero componenti rettangolari in cui è possibile leggere/scrivere una linea di testocostruzione:new TextField(int columns)

– altri costruttori disponibiliinserimento in una finestra applet:add(<riferimentoIstanzaTF>)

metodi interessanti– public void setText(String t)

specifica il nuovo contenuto del campo di testo – public String getText()

restituisce il contenuto del campo di testo

Page 20: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0320

esempio: intercettare l'input in un campo di testo

applet IntercettaTF: visualizza, tramite drawString, la stringa specificata dall'utente nel campo di testoorigine evento: il campo di testointerfaccia da implementare: ActionListenerclasse evento rilevante: ActionEventclasse da realizzare, che implementa ActionListener: TFListener

Page 21: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0321

classe IntercettaTFpublic class IntercettaTF extends Applet {private final int LARGH = 12;private TextField campoTesto;private String text = "";private TFListener listener;

public void init() {campoTesto = new TextField(LARGH);add(campoTesto);listener = new TFListener();campoTesto.addActionListener(listener);

}

public void paint(Graphics g) {g.drawString(text, 50, 160 );

}}

Page 22: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0322

classe TFListener /1

public class TFListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

/*

azioni da svolgere:

1. acquisisce con getText il testo

2. memorizza testo in var. text

3. "pulisce" campo di testo

*/

}

}

Page 23: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0323

classe TFListener /2

problema: per acquisire il testo, e memorizzarlo nella variabile text, occorre scrivere text = campoTesto.getText(), ma le variabili text e campoTesto sono risorse private interne alla classe IntercettaTF

la classe TFListener non può utilizzare tali variabilisoluzione: utilizzo di classi interne

Page 24: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0324

classi interne /1

classi specificate all'interno di un'altra classeschema:public class ClasseEsterna {

private class ClasseInterna {

}

}

Page 25: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0325

classi interne /2

una classe interna è una classe che ha la particolarità di poter accedere alle variabili istanza definite nella classe che la contieneconserva le altre caratteristiche di una classela classe che la contiene può istanziare oggetti della classe interna– per le altri classi la possibilità dipende dallo

specificatore di accesso public o private

Page 26: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0326

classe TFListener /3

rendiamo TFListener classe interna di IntercettaTF

public class IntercettaTF extends Applet {

private class TFListener implements ActionListener {

}

}

Page 27: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0327

classe TFListener /4

private class TFListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

text = campoTesto.getText();

campoTesto.setText("");

}

}

Page 28: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0328

applet intera

composta di un solo file (IntercettaTF.java), oltre al file HTML

funziona correttamente?

proviamo l'esecuzione

non "ridisegna" quando necessario

Page 29: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0329

metodo repaint()

la chiamata repaint() chiede al gestore delle finestre di chiamare il metodo paint non appena possibile

di norma va inserita all'interno del metodo che serve un evento in seguito a cui può essere opportuno ridisegnare

Page 30: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0330

classe TFListener /5

private class TFListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

text = campoTesto.getText();

campoTesto.setText("");

// ridisegna, appena possibile

repaint();

}

}

Page 31: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0331

intercettare la pressione dei tasti in un campo di testo

origine evento: campo di testointerfaccia da implementare: KeyListenerclasse evento rilevante: KeyEvent

Page 32: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0332

interfaccia KeyListener

1. void keyPressed(KeyEvent e)chiamato quando viene premuto un tasto

2. void keyReleased(KeyEvent e)chiamato quando viene rilasciato un tasto

3. void keyTyped(KeyEvent e)chiamato quando viene premuto e rilasciato un tasto

Page 33: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0333

altre interfacce utili

WindowListener

– classe evento rilevante: WindowEvent– prevede sette metodi void: windowActivated, windowClosed, windowClosing, windowDeactivated, windowDeiconified, windowIconified, windowOpened, tutti con parametro WindowEvent

MouseMotionListener

– classe evento rilevante: MouseEvent– prevede due metodi void: mouseDragged, mouseMoved,

tutti con parametro di tipo MouseEvent

Page 34: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0334

classi "adapter"

per ogni interfaccia XXXListener con più di un metodo esiste una classe predefinita XXXAdapter che la implementa, in cui tutti i metodi previsti sono vuotiinvece di implementare XXXListener si può dunque estendere XXXAdapter, sovrascrivendo solo i metodi di interessel'utilità consiste nel non dover implementare esplicitamente tutti i metodi previsti dall'interfaccia quando interessano solo alcuni/pochi degli eventi trattati dall'interfaccia

Page 35: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0335

metodo getSource

definito per tutte le classi eventopublic Object getSource()restituisce l'oggetto su cui si è verificato l'eventoutile quando si associa lo stesso oggetto ricevitore a più componenti

Page 36: interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...User closes a frame (main window) WindowListener ActionListener User clicks a button, presses Return

maggio 2003IGEA 02-0336

esempio: applet per il trascinamento di un uovo

applet EggDrag: trascina un uovo, guidato dal movimento del mouseorigine eventi: l'appletinterfacce da implementare: MouseListener (metodo mousePressed) e MouseMotionListener(mouseDragged)classe evento rilevante: MouseEventclasse intercettatrice da realizzare, che implementa MouseListener e MouseMotionListener: MyMouseMotionListener