swing. modello ad eventi i componenti interagiscono attraverso l’invio di messaggi broadcast o...
TRANSCRIPT
![Page 1: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/1.jpg)
Swing
![Page 2: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/2.jpg)
Modello ad eventi
• I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast– “Attenzione! C’è un incendio”– “Si avvisano i signori passeggeri che …”
• Ogni componente notifica un cambiamento nel proprio stato o in quello dell’ambiente inviando un messaggio– In tal caso agisce da “generatore dell’evento”
• Tutti i componenti interessati all’evento descritto da tale messaggio ne ricevono copia– In tal caso agiscono da “ascoltatori dell’evento”
• In generale, il generatore dell’evento non conosce né il numero né l’identità degli ascoltatori
![Page 3: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/3.jpg)
Modello ad eventi• Con il paradigma a eventi
– L’applicazione è puramente “reattiva”– Non è possibile identificare staticamente un flusso di controllo unitario
• Il programma principale si limita a inizializzare l’applicazione, istanziando gli osservatori e associandovi gli opportuni handler
![Page 4: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/4.jpg)
Modello ad eventi
• Utili per sistemi altamente dinamici ed evolutivi, in cui nuovi moduli si possono aggiungere o possono essere eliminati
• Per comunicare tra di loro, i moduli non devono conoscere le rispettive identità come invece accade con gli altri oggetti Java– nomeModulo.nomeServizio (parametri)
• Si parla più in generale di paradigma di progettazione• "publish and subscribe"
– moduli che generano eventi ("publish")– moduli che sottoscrivono l'interesse ad essere notificati
dell'occorrenza di certi eventi ("subscribe")
![Page 5: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/5.jpg)
Observer Pattern Publish-Subscribe Pattern
• "Don't call us. Give us your telephone number, and we will call you if and when we have a job for you.” [Hollywood Principle]
• “Instead of your program running the system, the system runs your program”
![Page 6: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/6.jpg)
javax.swing
• Un’applicazione può essere costruita come componenti che interagiscono attraverso eventi
• Tutti i componenti di una determinata interfaccia possono– generare determinati eventi– mettersi in ascolto di determinati eventi
• Vediamo il package javax.swing che fornisce le classi che consentono la progettazione delle interfacce utente secondo lo stile ad eventi
• Altre librerie interessanti: Java2D, Java3D…
![Page 7: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/7.jpg)
GUI
• GUI: Graphical User Interface• L'interfaccia utente costituisce il mezzo con il
quale l'utente interagisce con l'applicazione– costituisce il "look&feel"
• Fondamentale per l'usabilità del software• Dev’essere progettata con cura– Non è un lavoro da ingegneri progettarla, lo è
implementarla
![Page 8: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/8.jpg)
Separare GUI e parte funzionale
• La GUI si preoccupa di interagire con l'utente– visualizzare– accettare input
• La parte funzionale contiene la logica applicativa• GUI modificabile senza toccare la parte funzionale e
viceversa• Diverse strategie "look&feel" per la stessa
applicazione• Spesso le modifiche si incentrano sulla GUI al fine di
migliorare l'usabilità
![Page 9: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/9.jpg)
MVC: Model View Controller• Swing si basa su un “paradigma” di progettazione che
si incontra anche in altri campi:– Un componente ha un suo “modello logico”– Un componente ha un suo “aspetto visuale”– Un componente ha “comportamenti” che consentono la sua
interazione con il resto dell’applicazione• Esempio -> JButton– Model: Premuto/Rilasciato (variabile booleana)– View: Dipende dal look&feel– Controller:
• Sulla base dell’input utente (bottone premuto) aggiorna il Model o implementa la logica applicativa.
• In Java: ActionPerformed della classe ActionListener collegata al JButton
![Page 10: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/10.jpg)
MVC: Model View Controller• L’obiettivo del paradigma MVC è quello di disaccoppiare il
dato dal suo comportamento e dalla sua view.• Non è sempre possibile farlo.
![Page 11: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/11.jpg)
AWT / Swing• Abstract Windowing Toolkit (AWT)
– È la precedente versione delle librerie grafiche di JAVA. Fornisce ancora alcuni importanti componenti per il funzionamento e la creazione dell’ interfaccia
• Swing– Consentono di realizzare applicazioni con un “look and feel” più
aggiornato e elegante– Si basano su un modello di interazione introdotto da JAVA2– Hanno superato alcuni dei difetti di AWT– Chiedono servizi al sistema operativo, ma (normalmente) ad un livello
più basso e riescono così ad avere un maggiore controllo del “look and feel”
– Sono una “estensione” del core di JAVA e possono risultare più complesse da programmare
– Consentono un maggior controllo del look&feel di un’applicazione e garantiscono il medesimo look&feel su tutte le piattaforme
![Page 12: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/12.jpg)
AWT / Swing
• Il nome di tutti i componenti Swing inizia con J– La convenzione è JXxxx
• I componenti Swing sono lightweight– Un componente lightweight implementa il suo look-and-feel
direttamente in Java senza delegarlo al sistema operativo che ospita l’applicazione
• Maggior uniformità di comportamento• È bene non includere componenti Swing ed AWT in una• stessa interfaccia:
– I componenti AWT (heavyweight) vengono sempre mostrati “sopra” i componenti Swing (ad esempio con i Menu)
• Problema dovuto alla mancanza di compatibilità fra i due framework
![Page 13: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/13.jpg)
Un’interfaccia Swing
• Tre elementi fondamentali– Contenitori– Elementi grafici– Eventi
![Page 14: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/14.jpg)
Frame
• Un frame– Definisce l’intelaiatura dell’interfaccia– Fornisce un rettangolo, “decorato” alla maniera
delle finestre cui siamo abituati– È un oggetto complesso
![Page 15: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/15.jpg)
javax.swing.JFrame
• Come in tutta la programmazione ad oggetti occorre conoscere la “gerarchia” entro la quale si colloca JFrame
• Per conoscere la “derivazione” di ogni oggetto delle librerie GUI di Swing si deve fare ricorso alla documentazione on line di Java
![Page 16: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/16.jpg)
Scorrendo la gerarchia
• Component– “A component is an object having a graphical representation that
can be displayed on the screen and that can interact with the user. Examples of components are the buttons, checkboxes, and scrollbars of a typical graphical user interface”
– Component è quindi una classe molto generale e definisce un sacco di metodi
• Container– Un Component con la proprietà di essere abilitato a contenere altri
Component– Prevede metodi di tipo “add” per aggiungere componenti– Prevede anche metodi per rappresentare il contenitore e i suoi
contenuti e per aggiornarne l’immagine
![Page 17: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/17.jpg)
Scorrendo la gerarchia• Window
– È un particolare contenitore che può apparire sullo schermo come entità propria, ma non ha bordi, barre e controlli
– Possiede metodi per mostrare la finestra, nascondere la finestra, posizionare la finestra e aggiustare l’ordine di comparizione relativamente ad altre finestre
• Frame– Si tratta di Window con bordi e barra del titolo, oltre alle caratteristiche solite
di un’interfaccia (minimizzazione, iconizzazione, chiusura, resizing)• JFrame
– È un Frame AWT a cui SWING aggiunge una serie di metodi per ridefinire i dettagli grafici. Ad esempio
– ll metodo setSize(int l, int h) permette di determinare le dimensioni del Frame– Il metodo setLocation(int x, int y) consente di definire le coordinate del pixel in
alto a sinistra del frame nel riferimento dello schermo
![Page 18: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/18.jpg)
Cosa possiamo fare con un JFrame?
• Non possiamo disegnare, scrivere o aggiungere elementi direttamente al Frame
• Gli elementi diversi dal Menu debbono essere “aggiunti” ad un Container opportuno
• Ad esempio– Per scrivere del testo dentro un Frame, il testo dovrà essere
scritto (aggiunto) al pannello contentPane del JFrame– Il metodo add() di JFrame si occupa di tutto il lavoro
frame.getContentPane().add(label);frame.add(label);
![Page 19: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/19.jpg)
![Page 20: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/20.jpg)
![Page 21: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/21.jpg)
Look and feel
![Page 22: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/22.jpg)
Aggiungiamo componenti• Dobbiamo sapere: – Da dove prendere i componenti?
• Una lista/descrizione delle librerie disponibili
– Come costruirli e personalizzarli?• Costruttori e modificatori
– Come usarli?• Quali eventi sono in grado di raccogliere e quali i listener necessari
– Come disporli sui frame che costituiscono la nostra applicazione?• Layout manager
![Page 23: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/23.jpg)
![Page 24: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/24.jpg)
![Page 25: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/25.jpg)
![Page 26: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/26.jpg)
![Page 27: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/27.jpg)
Layout• Java gestisce la disposizione dei componenti dentro i Container
mediante oggetti che si chiamano LayoutManager– Incapsulano gli algoritmi per il posizionamento delle componenti di una GUI
• Il LayoutManager mantiene l’algoritmo separato in una classe a parte– È un’interfaccia che descrive come un componente deve comunicare con il
suo LayoutManager• Esiste un’ampia collezione di LayoutManager, ma se si vuole si può
creare il proprio• Più comuni FlowLayout, BorderLayout, GridLayout, CardLayout e
GridBagLayout• L’associazione avviene tramite il metodo setLayout() di cui è provvista
la classe Container (e quindi tutte le sue sottoclassi)– p.setLayout(new BorderLayout());
![Page 28: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/28.jpg)
![Page 29: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/29.jpg)
BorderLayout• Definisce 5 aree logiche: NORTH, SOUTH, CENTER, EAST e WEST• Richiede la dimensione preferita del componente (altezza e
larghezza)• Se il componente è NORTH o SOUTH setta l’altezza al valore preferito
e la larghezza in modo da occupare tutto lo spazio orizzontale• Se il componente è EAST o WEST setta la larghezza al valore preferito
e l’altezza in modo da occupare tutto lo spazio verticale restante• Se il componente è CENTER setta l’altezza e la larghezza in modo da
occupare tutto lo spazio centrale restante• Quindi
– Le posizioni NORTH e SOUTH servono quando vogliamo fissare l’altezza di un componente al valore preferito
– Le posizioni EAST e WEST servono quando vogliamo fissare la larghezza di un componente al valore preferito
– La parte CENTER è quella che si espande
![Page 30: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/30.jpg)
![Page 31: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/31.jpg)
GridLayout
![Page 32: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/32.jpg)
![Page 33: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/33.jpg)
Eventi
• L’interazione tra gli elementi dell’interfaccia e la logica applicativa è gestita tramite eventi
• Gli EventListener sono interfacce definite per catturare e processare tipi di eventi particolari
• Un listener deve– Essere associato al componente– Essere informato quando il componente genera un evento del
tipo richiesto– Rispondere facendo qualcosa di appropriato
![Page 34: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/34.jpg)
EventHandler
• Devono avere tre pezzi di codice– Dichiarazione• Estendono o implementano listener esistenti• public class MyClass implements ActionListener {
– Associazione tra handler (ovvero listener) e istanza• someComponent.addActionListener(instanceOfMyClass);
– Definizione del codice che implementa i metodi dell’interfaccia listener• public void actionPerformed(ActionEvent e) { ...
![Page 35: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/35.jpg)
Demo
![Page 36: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/36.jpg)
Demo
![Page 37: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/37.jpg)
Eventi e Listener
![Page 38: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/38.jpg)
Esempio
![Page 39: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/39.jpg)
![Page 40: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/40.jpg)
![Page 41: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/41.jpg)
Esempio
![Page 42: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/42.jpg)
![Page 43: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/43.jpg)
GUI Swing - multithreading
• Quando si scrive una GUI Swing si assiste a un cambio di paradigma– Programma con flusso centralizzato -> programma reattivo
basato su eventi• Per questo motivo le Swing adottano un’architettura multi-thread
• Ciò permette di ottenere interfacce sempre reattive e che non si “bloccano”– Esempio: se ho un client di posta elettronica e qualcuno mi
spedisce un messaggio di 10M voglio comunque potere: vedere l’intestazione della mail, vedere una barra che mi indica quanto manca al download, scrivere una nuova mail nel frattempo, ecc.
![Page 44: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/44.jpg)
3 tipi di thread - thread iniziale
• Il thread iniziale instanzia la GUI e prosegue con le sue operazioni
![Page 45: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/45.jpg)
3 tipi di thread - EDT
• EDT: Event Dispatch Thread• Tutto il codice per la gestione dell’interfaccia grafica viene
eseguito dentro l’EDT• Esiste una coda di eventi di sistema che raccoglie i click del
mouse, la pressione sui tasti della tastiera, ecc.• L’EDT controlla ciclicamente la coda
– Raccoglie un evento e decide cosa farne– Se è un click su un bottone chiama il metodo per la gestione del
click del mouse su quel bottone• La gestione mediante coda garantisce che venga rispettato
un certo ordine nella gestione degli eventi
![Page 46: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/46.jpg)
Perché EDT?
• Immaginiamo cosa sarebbe successo se non avessimo avuto l’EDT
• Ipotizziamo di avere due tasti: A e B– Tasto A
• Legge il contenuto di un file e lo presenta all’utente all’interno di una textBox
– Tasto B• Legge dallo stesso textBox e scrive i contenuti su un file
• Cosa succede se premo molto velocemente prima A e poi B?– Probabilmente avrei un comportamento anomalo
• È per questo che tutto ciò che lavora sull’interfaccia gira all’interno di un unico thread
![Page 47: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/47.jpg)
SwingUtilities
• Il modo giusto di inizializzare una GUI quindi non è quello che abbiamo visto prima, ma…
SwingUtilities.invokeLater(new Runnable() {public void run() {createAndShowGUI();}})
• In questo modo creo un oggetto Runnable (il quale si occupa di creare l’interfaccia) e chiedo che venga gestito dall’EDT
![Page 48: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/48.jpg)
La coda degli eventi di sistema
![Page 49: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/49.jpg)
Progettazione di un’interfaccia
• Per avere una buona interfaccia grafica bisogna essere reattivi– Bisogna dare l’impressione all’utente che sia sempre sotto
controllo• Il segreto è cercare di scrivere EventListener che siano
veloci• In questo modo eviteremo situazioni in cui un click può
portare a una lunga attesa prima di vedere un risultato• Ma se devo fare qualcosa che richiede tempo? Come
faccio?– Dobbiamo introdurre il terzo tipo di thread
![Page 50: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/50.jpg)
3 tipi di thread - Worker Thread
• Il Worker thread– viene creato dal programmatore– per l’esecuzione di compiti gravosi in background
![Page 51: Swing. Modello ad eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast – “Attenzione! C’è un incendio” – “Si avvisano](https://reader036.vdocuments.pub/reader036/viewer/2022062512/5542eb6a497959361e8d6fd4/html5/thumbnails/51.jpg)
Per chi vuole approfondire…
• Il modo giusto è quello di usare un oggetto SwingWorker
• Definisce un metodo che si occupa del lavoro in background, e un secondo metodo che invece verrà eseguito nell’EDT e che fa da ponte tra il background thread e la GUI