Guida alla programmazione delle GUI, interfacce grafiche in Java 2D - 4: la gestione degli eventi: listener, adapter
Capitolo 04: La gestione degli eventi (prima parte, teorica): listener, adapter.
In questo capitolo esamineremo la 'filosofia' che sta alla base del meccanismo di gestione degli eventi AWT.
Per il momento esprimeremo solo dei 'concetti': per il codice e gli esempi, dovremo aspettare di conoscere, prima, le componenti della GUI.
La GUI delle applicazioni è 'sempre all'erta': in qualunque momento, l'utente può cliccare su una componente o premere un tasto della tastiera, e la GUI deve intercettare tali eventi e gestirli; non solo: esistono anche eventi time-driven, generati da thread eseguiti in parallelo (o... pseudo-parallelo), che non dipendono dall'utente ma che implicano un aggiornamento della GUI.
Tutti queste considerazioni stanno alla base del paradigma di programmazione orientata agli eventi.
I linguaggi di programmazione implementano in vari modi, spesso molto differenti tra loro, tale paradigma.
Java prevede particolari oggetti, i listener (lett.: 'ascoltatori'), che vengono 'avvisati' dal sistema quando si verifica un evento che li riguarda (es.: il listener degli eventi da tastiera verrà invocato quando l'utente premerà , appunto, un tasto della tastiera) e che hanno il compito di gestire tali eventi (ovviamente, l'implementazione del metodo o dei metodi di gestione spetta al programmatore !).
La relazione componente-listener è di tipo molti-a-molti: un componente può avere più listener che, a loro volta, possono essere 'registrati' presso più componenti (è possibile, ad esempio, utilizzare un oggetto contenitore come listener e registrarvi tutti gli oggetti GUI in esso contenuti, per gestirne gli eventi).
I listener sono interfacce da implementare, il che significa che spesso siamo 'obbligati' a riscrivere certi metodi.
In futuro prenderemo in esame tali listener singolarmente e vedremo quali metodi riscrivere di volta in volta; a volte, comunque, non sarà necessario riscrivere TUTTI i metodi 'obbligatori' di un listener (in certi casi, anche sette), avvalendosi di particolari classi (non interfacce !) dette adapter.
Un adapter è una classe che implementa un'interfaccia, lasciando però vuoti i corpi dei metodi da riscrivere 'obbligatoriamente'; se il programmatore avrà , poi, bisogno di implementare uno di questi metodi, potrà riscriverlo (overriding).
Considerazione finale: ricordare tutti gli eventi, i listener, i metodi e gli adapter è praticamente impossibile e poco utile (potrebbero cambiare con una nuova versione del linguaggio !): è indispensabile far uso della documentazione ufficiale.
Per concludere, ecco qui (riassunta) la gerarchia di eventi di AWT:

La tabella seguente, invece, riassume le associazioni eventi-listener-adapter presenti in AWT:
| EVENTO |
LISTENER |
ADAPTER |
| ActionEvent |
ActionListener |
|
| AdjustementEvent |
AdjustementListener |
|
| ComponentEvent |
ComponentListener |
ComponentAdapter |
| ContainerEvent |
ContainerListener |
ContainerAdapter |
| FocusEvent |
FocusListener |
FocusAdapter |
| KeyEvent |
KeyListener |
KeyAdapter |
| MouseEvent |
MouseListener, MouseMotionListener |
MouseAdapter, MouseMotionAdapter |
| TextEvent |
TextListener |
|
| WindowEvent |
WindowListener |
WindowAdapter |
|