interfacce ed eventi - dis.uniroma1.itdamore/igea/newmateriale/trasparenze_docente...user closes a...
TRANSCRIPT
interfacce ed eventi
intercettare il mouse ed altri eventi
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
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)
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
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
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
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
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.
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
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>)
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
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
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)
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)
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
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()); }}
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
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
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
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
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 );
}}
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
*/
}
}
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
maggio 2003IGEA 02-0324
classi interne /1
classi specificate all'interno di un'altra classeschema:public class ClasseEsterna {
…
private class ClasseInterna {
…
}
}
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
maggio 2003IGEA 02-0326
classe TFListener /3
rendiamo TFListener classe interna di IntercettaTF
public class IntercettaTF extends Applet {
…
private class TFListener implements ActionListener {
…
}
}
maggio 2003IGEA 02-0327
classe TFListener /4
private class TFListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
text = campoTesto.getText();
campoTesto.setText("");
}
}
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
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
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();
}
}
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
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
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
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
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
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