Scaletta *8,H$:7 Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/~mizzaro mizzaro@dimi.uniud.it 12 maggio 2003 z GUI z GUI in Java: l AWT z Esempi z Principi alla base Componenti, eventi, gestori eventi (ascoltatori) Classi interne Layout z Da fare e da non fare Stefano Mizzaro - GUI e AWT 2/37 Cos è una GUI z Graphical User Interface z Interazione utente-programma basata su Linea di comando (shell Unix) z Solo testo, tastiera, cursore GUI (Mozilla, MSWord, XEmacs, ) z Grafica, finestre, pulsanti, puntatore/mouse, menu z Finora solo linea di comando z Come si fanno le GUI in Java? Stefano Mizzaro - GUI e AWT 3/37 z 7XWWRqXQRJJHWWR GUI in Java Finestre, pulsanti, (componenti) Azioni dell utente! (eventi) Gestori degli eventi z AWT (Abstract Window Toolkit): classi predefinite (java.awt.*, java.awt.event.*, ) z AWT: GUI indipendenti dalla piattaforma (lo stesso codice funziona su varie piattaforme HW/SW) Stefano Mizzaro - GUI e AWT 4/37 Un esempio (1/2) z La nostra prima GUI: una finestra vuota che non fa nulla VXSHULQXWLOHVXSHU*8, VHW%RXQGV'LPHQVLRQL VHW7LWOH*8,7LWRORILQHVWUD VHW9LVLEOHWUXH5HQGHYLVLELOH Stefano Mizzaro - GUI e AWT 5/37 z Classe di prova z Proviamo! Un esempio (2/2) SXEOLFFODVV3URYD*8,^ *8,ILQHVWUD3ULQFLSDOH QHZ*8, 6\VWHPRXWSULQWOQ)LQH Stefano Mizzaro - GUI e AWT 6/37 Stefano Mizzaro 1
Come funziona? Le classi usate z In GUI1 c è solo il costruttore z che viene chiamato nel main z e, usando opportunamente i metodi delle sopraclassi, crea la finestra z Notate che Fine viene visualizzato subito z Cosa c è in Frame e nelle superclassi? Stefano Mizzaro - GUI e AWT 7/37 Stefano Mizzaro - GUI e AWT 8/37 Gestione eventi z Così com è non fa nulla! z Ci sono solo componenti, non gestori di eventi z Modifichiamo la nostra GUI per gestire un evento (chiusura finestra) z Click su X evento che codice eseguire? z Invocazioni implicite: il programmatore scrive il metodo, non la chiamata mette il metodo è in un oggetto (ascoltatore) associa l oggetto all azione Stefano Mizzaro - GUI e AWT 9/37 Ascoltatore (1/3) SXEOLFFODVV*8, H[WHQGV)UDPH ^ SXEOLF*8, ^ $VFROWDWRUHDVF QHZ$VFROWDWRUH VHW%RXQGV VHW7LWOH*8, VHW9LVLEOHWUXH DGG:LQGRZ/LVWHQHUDVF$JJLXQJH ODVFROWDWRUH Stefano Mizzaro - GUI e AWT WKLVDGG:LQGRZ/LVWHQHUDVF 10/37 HYHQW Ascoltatore (2/3) Ascoltatore (3/3) SXEOLFFODVV$VFROWDWRUHH[WHQGV:LQGRZ$GDSWHU ^ SXEOLFYRLGZLQGRZ&ORVHG :LQGRZ(YHQW H^ SXEOLFFODVV3URYD*8, ^ *8, ILQHVWUD3ULQFLSDOH QHZ*8, 6\VWHPRXWSULQWOQ)LQH SXEOLFYRLGZLQGRZ&ORVLQJ :LQGRZ(YHQW H^ HJHW:LQGRZGLVSRVH Stefano Mizzaro - GUI e AWT 11/37 z (quasi nessuna modifica) Stefano Mizzaro - GUI e AWT 12/37 Stefano Mizzaro 2
Meccanismo di gestione eventi z Azione utente z Creazione dell istanza dell evento opportuno (sottoclasse di AWTEvent) z Invocazione (automatica) dei metodi dell ascoltatore (un istanza di EventListener) L ascoltatore deve essersi registrato in precedenza per quegli eventi (addwindowlistener) L istanza-evento viene passata come argomento al metodo invocato automaticamente Stefano Mizzaro - GUI e AWT 13/37 Ascoltatori e adattatori Stefano Mizzaro - GUI e AWT 14/37 Gerarchia degli eventi Stefano Mizzaro - GUI e AWT 15/37 Tutto è un oggetto! z 3 istanze: La GUI (Frame) L evento generato dal click del mouse sul pulsante di chiusura finestra (WindowEvent) L ascoltatore con il codice eseguito per gestire l evento (WindowListener) z Facciamo un diagramma unico! z (4a istanza: il gestore della posizione degli oggetti che potrebbero esserci nella finestra) Stefano Mizzaro - GUI e AWT 16/37 Senza l adattatore HYHQW SXEOLFFODVV$VFROWDWRUHLPSOHPHQWV:LQGRZ/LVWHQHU ^ SXEOLFYRLGZLQGRZ2SHQHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ,FRQLILHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ'HLFRQLILHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ$FWLYDWHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ'HDFWLYDWHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ&ORVHG :LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ&ORVLQJ :LQGRZ(YHQW H^ HJHW:LQGRZGLVSRVH Stefano Mizzaro - GUI e AWT 17/37 Ascoltatori e classi interne z Meglio estendere un Adapter che implementare un Listener z Però c è eredità singola z e poi è scomodo creare tante classi z e poi come accedo alle variabili z Soluzione: classi interne per gli ascoltatori Membro ( dentro la classe ) (usate questa!) Locali ( dentro un metodo ) Anonime ( dentro un metodo e senza nome ) Stefano Mizzaro - GUI e AWT 18/37 Stefano Mizzaro 3
Ascoltatore e classe membro HYHQW FODVV$VFROWDWRUHH[WHQGV:LQGRZ$GDSWHU^ Ascoltatore e classe locale HYHQW FODVV$VFROWDWRUHH[WHQGV:LQGRZ$GDSWHU^ Stefano Mizzaro - GUI e AWT 19/37 Stefano Mizzaro - GUI e AWT 20/37 Ascoltatore e classe anonima HYHQW :LQGRZ$GDSWHU DVF QHZ:LQGRZ$GDSWHU^ DGG:LQGRZ/LVWHQHUQHZ:LQGRZ$GDSWHU^ Stefano Mizzaro - GUI e AWT 21/37 Aggiungiamo qualcosa z Ok, ora l interfaccia fa qualcosa, ma è vuota z Aggiungiamo: un etichetta (Label) un pulsante (Button) add, definito in Component Stefano Mizzaro - GUI e AWT 22/37 Etichetta e pulsante (1/5) FODVV*8, H[WHQGV)UDPH ^ SXEOLF*8, ^ $VFROWDWRUHDVF QHZ$VFROWDWRUH VHW%RXQGV VHW7LWOH*8, WKLVDGG1RUWKQHZ/DEHO3UHPLLOSXOVDQWH %XWWRQ E QHZ%XWWRQ3UHPLPL 3DQHOS QHZ3DQHO SDGGE WKLVDGG6RXWKS WKLVDGG:LQGRZ/LVWHQHUDVF VHW9LVLEOHWUXH Stefano Mizzaro - GUI e AWT 23/37 Etichetta e pulsante (2/5) SXEOLFFODVV3URYD*8, ^ *8, ILQHVWUD3ULQFLSDOH QHZ*8, z Eh, il pulsante non fa nulla z perché manca l ascoltatore! z Click su pulsante ActionEvent Stefano Mizzaro - GUI e AWT 24/37 Stefano Mizzaro 4
Etichetta e pulsante (3/5) HYHQW FODVV$VFROWDWRUH3XOVDQWHLPSOHPHQWV$FWLRQ/LVWHQHU ^ 6\VWHPRXWSULQWOQ+DLSUHPXWRLOSXOVDQWH Stefano Mizzaro - GUI e AWT 25/37 Etichetta e pulsante (4/5) FODVV*8, H[WHQGV)UDPH ^ SXEOLF*8, ^ $VFROWDWRUHDVF QHZ$VFROWDWRUH $VFROWDWRUH3XOVDQWHDS QHZ$VFROWDWRUH3XOVDQWH VHW%RXQGV VHW7LWOH*8, WKLVDGG1RUWKQHZ/DEHO3UHPLLOSXOVDQWH %XWWRQ E QHZ%XWWRQ3UHPLPL 3DQHOS QHZ3DQHO SDGGE WKLVDGG6RXWKS WKLVDGG:LQGRZ/LVWHQHUDVF EDGG$FWLRQ/LVWHQHUDS VHW9LVLEOHWUXH Stefano Mizzaro - GUI e AWT 26/37 Etichetta e pulsante (5/5) SXEOLFFODVV3URYD*8, ^ *8, ILQHVWUD3ULQFLSDOH QHZ*8, Layout z Come disporre gli oggetti dentro un Container ( contenitore ) z LayoutManager: gestore di layout z Ogni sottoclasse di Container ha associata un istanza di LayoutManager z Ogni sottoclasse di Container ha un gestore di layout GLGHIDXOW (BorderLayout per Frame) Stefano Mizzaro - GUI e AWT 27/37 Stefano Mizzaro - GUI e AWT 28/37 Da fare e da non fare z Finestra con due bottoni z Classe MyFrame che Estende Frame Implementa uno o più listener z Si può fare in due modi Male Bene Stefano Mizzaro - GUI e AWT 29/37 MalFatto.java (1/3) HYHQW SXEOLFFODVV0DO)DWWRH[WHQGV)UDPH LPSOHPHQWV$FWLRQ/LVWHQHU:LQGRZ/LVWHQHU ^ %XWWRQ E QHZ%XWWRQ3XOVDQWH E QHZ%XWWRQ3XOVDQWH SXEOLF0DO)DWWR^ DGGEDGGE EDGG$FWLRQ/LVWHQHUWKLV EDGG$FWLRQ/LVWHQHUWKLV DGG:LQGRZ/LVWHQHUWKLV Stefano Mizzaro - GUI e AWT 30/37 Stefano Mizzaro 5
MalFatto.java (2/3) 2EMHFWVRXUFH HJHW6RXUFH LI VRXUFH E HOVHLI VRXUFH E HOVH 6\VWHPRXWSULQWOQ4XDOFRVDOWUR Stefano Mizzaro - GUI e AWT 31/37 MalFatto.java (3/3) SXEOLFYRLGZLQGRZ&ORVLQJ:LQGRZ(YHQW H^ 6\VWHPRXWSULQWOQ:LQGRZ&ORVLQJ SXEOLFYRLGZLQGRZ&ORVHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ'HLFRQLILHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ,FRQLILHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ$FWLYDWHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ'HDFWLYDWHG:LQGRZ(YHQW H^ SXEOLFYRLGZLQGRZ2SHQHG:LQGRZ(YHQW H^ SXEOLFVWDWLFYRLGPDLQ6WULQJ>@DUJV^ )UDPH ILQHVWUD QHZ0DO)DWWR Stefano Mizzaro - GUI e AWT 32/37 Perché è fatto male z Classe che fa 2 cose Costruisce la GUI Gestisce gli eventi z Tanti metodi vuoti inutili z Catene di if/else z N.B. Purtroppo molti libri usano questa tecnica / Stefano Mizzaro - GUI e AWT 33/37 BenFatto.java (1/2) HYHQW SXEOLFFODVV%HQ)DWWRH[WHQGV)UDPH ^ SXEOLF%HQ)DWWR^ %XWWRQ E QHZ%XWWRQ3XOVDQWH E QHZ%XWWRQ3XOVDQWH DGGEDGGE EDGG$FWLRQ/LVWHQHUQHZ$VFROWDWRUH3XOVDQWH EDGG$FWLRQ/LVWHQHUQHZ$VFROWDWRUH3XOVDQWH DGG:LQGRZ/LVWHQHUQHZ:LQGRZ$GDSWHU^ SXEOLFYRLGZLQGRZ&ORVLQJ:LQGRZ(YHQW H^ 6\VWHPRXWSULQWOQ:LQGRZ&ORVLQJ Stefano Mizzaro - GUI e AWT 34/37 BenFatto.java (2/2) SXEOLFFODVV$VFROWDWRUH3XOVDQWH LPSOHPHQWV$FWLRQ/LVWHQHU ^ SXEOLFFODVV$VFROWDWRUH3XOVDQWH LPSOHPHQWV$FWLRQ/LVWHQHU ^ SXEOLFVWDWLFYRLGPDLQ6WULQJ>@DUJV^ )UDPH ILQHVWUD QHZ%HQ)DWWR Stefano Mizzaro - GUI e AWT 35/37 Perché è fatto bene z Ascoltatori con classi interne z Evito codice inutile z Ogni classe fa un unica cosa z Evito catene di if/else, uso l eredità z 8QDFODVVHXQDUHVSRQVDELOLWj Stefano Mizzaro - GUI e AWT 36/37 Stefano Mizzaro 6
z GUI z GUI in Java: l AWT z Esempi z Principi alla base Riassunto Componenti, eventi, gestori eventi (ascoltatori) Classi interne Layout e layout manager z Da fare e da non fare Stefano Mizzaro - GUI e AWT 37/37 Stefano Mizzaro 7