interfacce ed eventi
intercettare il mouse ed altri eventi
interfacce: premessa… z
1.
2. z
2
il termine "interfaccia" occorre in Java con due significati, collegati ma distinti interface, parola chiave di Java e strumento di programmazione che viene introdotto in queste trasparenze parte o totalità dell'interfaccia utente, detta anche GUI (Graphical User Interface) per costruire GUI occorre usare le interface
IGEA 02-03
maggio 2003
interfaccia Java z z z
elenco di metodi pubblici che il progettista di una classe può impegnarsi a realizzare (implementare) in caso di impegno è obbligatorio realizzare tutti i metodi previsti per ciascun metodo è definita la firma (signature) – – –
z
3
nome tipo restituito numero e tipo di parametri
le interfacce possono essere usate come tipi (polimorfismo) IGEA 02-03
maggio 2003
sintassi interfaccia public interface { ; ; … } z non c’è bisogno di premettere alla firme dei metodi lo specificatore di accesso, poiché tutti i metodi sono automaticamente public z nelle API Java le interfacce sono elencate in corsivo
4
IGEA 02-03
maggio 2003
implementare un’interfaccia z z
z
5
una classe che implementa un’interfaccia ne realizza tutti i metodi, rispettando le firme si dichiara l’impegno a realizzare i metodi di un’interfaccia scrivendo public class implements {…} in caso di impegno non rispettato il compilatore segnalerà errore IGEA 02-03
maggio 2003
esempio: l’interfaccia shape z z z
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 –
z
6
le classi per oggetti grafici, come Rectangle2D.Double, Ellipse2D.Double, Line2D.Double e molte altre, implementano Shape
situazione simile per fill IGEA 02-03
maggio 2003
eventi z
azioni sulla tastiera, azioni con il mouse, generano eventi, ovvero fatti che potrebbero interessare il programma in esecuzione –
z
esempio: ad ogni piccolo spostamento del mouse il gestore delle finestre invia una comunicazione al programma in esecuzione per notificare l’evento (il piccolo spostamento) –
7
sono eventi relativi alla GUI
gli eventi notificati a un programma sono spesso centinaia o migliaia
IGEA 02-03
maggio 2003
eventi /2 z
per ogni tipologia interessante di evento esiste una classe Java corrispondente –
–
–
8
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. IGEA 02-03
maggio 2003
eventi /3 z
z
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 – –
z
9
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 IGEA 02-03
maggio 2003
ricevere eventi /1 1.
occorre in pratica identificare tre ingredienti a)
l’origine dell’evento –
b)
l’interfaccia che deve essere implementata dalla classe che istanzia i ricevitori per l’evento – –
c)
dipende dalla natura dell’evento (segue tabella estratta dal tutorial di Java) va importata (java.awt.event.)
la classe evento – –
10
dove può verificarsi l’evento? ad es., in un’applet, in un campo di testo, su un pulsante, su un menu ecc.
dipende dalla natura dell’evento va importata (java.awt.event.) IGEA 02-03
maggio 2003
tabella interfacce Act that results in the event
11
Listener type
User clicks a button, presses Return while typing in a text field, or chooses a menu item
ActionListener
User closes a frame (main window)
WindowListener
User presses a mouse button while the cursor is over a component
MouseListener
User moves the mouse over a component
MouseMotionListener
Component becomes visible
ComponentListener
Component gets the keyboard focus
FocusListener
Table or list selection changes
ListSelectionListener
IGEA 02-03
maggio 2003
ricevere eventi /2 2.
definire la classe che implementa l’interfaccia identificata a) b) c)
prendere atto di quali sono i metodi da implementare (imposti dall’interfaccia) capirne il significato (ogni metodo descrive il comportamento del programma in corrispondenza di uno specifico evento) implementare i metodi, sfruttando eventualmente la classe evento individuata –
12
i metodi di MouseEvent getX() e getY() consentono di ottenere le coordinate di pixel del punto in cui si è verificato l’evento IGEA 02-03
maggio 2003
ricevere eventi /3 3.
istanziare ed installare un oggetto ricevitore listener = new (); addMouseListener(listener); oppure addActionListener(listener); (o altre tipologie) –
13
tale codice va inserito in fase di inizializzazione della componente (applet) IGEA 02-03
maggio 2003
interfaccia MouseListener 1.
2.
3.
4. 5.
14
void mousePressed(MouseEvent event); chiamato quando un pulsante del mouse viene premuto su un componente (applet) void mouseReleased(MouseEvent event); chiamato quando un pulsante del mouse viene rilasciato su un componente (applet) void mouseClicked(MouseEvent event); chiamato quando un pulsante del mouse è stato premuto e rilasciato i rtapida successione su un componente (applet) void mouseEntered(MouseEvent event); chiamato quando il mouse entra in un componente (applet) void mouseExited(MouseEvent event); chiamato quando il mouse esce da un componente (applet) IGEA 02-03
maggio 2003
esempio: intercettare i clic del mouse su un’applet z z z z
15
origine evento: applet MouseSpyApplet interfaccia da implementare: MouseListener classe evento rilevante: MouseEvent classe da realizzare, che implementa MouseListener: MouseSpy
IGEA 02-03
maggio 2003
classe MouseSpy
16
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 2003
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
17
IGEA 02-03
maggio 2003
interfaccia ActionListener 1.
void actionPerformed(ActionEvent e) chiamato quando si verifica un'azione
z
(alcune) azioni interessanti: – –
18
l'utente preme un pulsante sulla GUI (Graphic User Interface) l'utente preme il tasto INVIO su un campo di testo
IGEA 02-03
maggio 2003
classe java.awt.TextField z
z
consente di istanziare campi di testo, ovvero componenti rettangolari in cui è possibile leggere/scrivere una linea di testo costruzione: new TextField(int columns) –
z z
inserimento in una finestra applet: add() metodi interessanti –
19
altri costruttori disponibili
–
public void setText(String t) specifica il nuovo contenuto del campo di testo public String getText() restituisce il contenuto del campo di testo
maggio 2003
esempio: intercettare l'input in un campo di testo z
z z z z
20
applet IntercettaTF: visualizza, tramite drawString, la stringa specificata dall'utente nel campo di testo origine evento: il campo di testo interfaccia da implementare: ActionListener classe evento rilevante: ActionEvent classe da realizzare, che implementa ActionListener: TFListener
IGEA 02-03
maggio 2003
classe IntercettaTF public 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); }
21
}
public void paint(Graphics g) { g.drawString(text, 50, 160 ); } IGEA 02-03
maggio 2003
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 */ } }
22
IGEA 02-03
maggio 2003
classe TFListener /2 z
z z
23
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 variabili soluzione: utilizzo di classi interne IGEA 02-03
maggio 2003
classi interne /1 z z
24
classi specificate all'interno di un'altra classe schema: public class ClasseEsterna { … private class ClasseInterna { … } } IGEA 02-03
maggio 2003
classi interne /2 z
z z
una classe interna è una classe che ha la particolarità di poter accedere alle variabili istanza definite nella classe che la contiene conserva le altre caratteristiche di una classe la classe che la contiene può istanziare oggetti della classe interna –
25
per le altri classi la possibilità dipende dallo specificatore di accesso public o private IGEA 02-03
maggio 2003
classe TFListener /3 z
rendiamo TFListener classe interna di IntercettaTF public class IntercettaTF extends Applet { … private class TFListener implements ActionListener { … } }
26
IGEA 02-03
maggio 2003
classe TFListener /4 private class TFListener implements ActionListener { public void actionPerformed (ActionEvent e) { text = campoTesto.getText(); campoTesto.setText(""); } }
27
IGEA 02-03
maggio 2003
applet intera
28
z
composta di un solo file (IntercettaTF.java), oltre al file HTML
z
funziona correttamente?
z
proviamo l'esecuzione
z
non "ridisegna" quando necessario IGEA 02-03
maggio 2003
metodo repaint()
29
z
la chiamata repaint() chiede al gestore delle finestre di chiamare il metodo paint non appena possibile
z
di norma va inserita all'interno del metodo che serve un evento in seguito a cui può essere opportuno ridisegnare
IGEA 02-03
maggio 2003
classe TFListener /5 private class TFListener implements ActionListener { public void actionPerformed (ActionEvent e) { text = campoTesto.getText(); campoTesto.setText(""); // ridisegna, appena possibile repaint(); } }
30
IGEA 02-03
maggio 2003
intercettare la pressione dei tasti in un campo di testo z z z
31
origine evento: campo di testo interfaccia da implementare: KeyListener classe evento rilevante: KeyEvent
IGEA 02-03
maggio 2003
interfaccia KeyListener 1.
2. 3.
32
void keyPressed(KeyEvent e) chiamato quando viene premuto un tasto void keyReleased(KeyEvent e) chiamato quando viene rilasciato un tasto void keyTyped(KeyEvent e) chiamato quando viene premuto e rilasciato un tasto
IGEA 02-03
maggio 2003
altre interfacce utili z
WindowListener – –
z
MouseMotionListener – –
33
classe evento rilevante: WindowEvent prevede sette metodi void: windowActivated, windowClosed, windowClosing, windowDeactivated, windowDeiconified, windowIconified, windowOpened, tutti con parametro WindowEvent classe evento rilevante: MouseEvent prevede due metodi void: mouseDragged, mouseMoved, tutti con parametro di tipo MouseEvent
IGEA 02-03
maggio 2003
classi "adapter" z
z
z
34
per ogni interfaccia XXXListener con più di un metodo esiste una classe predefinita XXXAdapter che la implementa, in cui tutti i metodi previsti sono vuoti invece di implementare XXXListener si può dunque estendere XXXAdapter, sovrascrivendo solo i metodi di interesse l'utilità consiste nel non dover implementare esplicitamente tutti i metodi previsti dall'interfaccia quando interessano solo alcuni/pochi degli eventi trattati dall'interfaccia IGEA 02-03
maggio 2003
metodo getSource z z
z
35
definito per tutte le classi evento public Object getSource() restituisce l'oggetto su cui si è verificato l'evento utile quando si associa lo stesso oggetto ricevitore a più componenti
IGEA 02-03
maggio 2003
esempio: applet per il trascinamento di un uovo z z z
z z
36
applet EggDrag: trascina un uovo, guidato dal movimento del mouse origine eventi: l'applet interfacce da implementare: MouseListener (metodo mousePressed) e MouseMotionListener (mouseDragged) classe evento rilevante: MouseEvent classe intercettatrice da realizzare, che implementa MouseListener e MouseMotionListener: MyMouseMotionListener IGEA 02-03
maggio 2003