Programmazione in Java - CEDACRI
a.a. 00/01
Lezione 9
Argomenti trattati
Interfaccie Utente Grafiche (GUI) e Programmazione Guidata dagli Eventi.
La gerarchia delle classi AWT/Swing.
(ATTENZIONE: Un overview molto chiaro e sintetico di questi argomenti e' presentato nei paragrafi 10.1, 10.2, e 10.3 del testo rifermento. Il resto del capitolo 10 presenta alcuni concetti in modo chiaro, senza enumerare tutti i dettagli di AWT/Swing. Una trattazione dettagliata, e piu' faticosa da leggere, si trova nei Capitoli 8 e 9 del libro "Java 2 i fondamenti".)
Programmi utilizzati
-
dal Cap. 10
(ATTENZIONE: alcuni degli esempi ilustrati in questo capitolo
hanno il pregio di essere
molto semplici, essi usano
il metodo paint per disegnare direttamente su un frame.
Questo stile di programmazione e' SCONSIGLIATO.
Altri esempi usano lo stile CONSIGLIATO, pero', per ridisegnare le componenti
grafiche poste
su di frame usano il metodo paint invece del metodo paintComponent.
Per ulteriori dettagli consultare il Capitolo 7 del libro
"Java 2 i fondamenti".)
- Etichette e bottoni
- Una classe che rappresenta un frame con una etichetta e un bottone
Frame1.java e una semplice applicazione che la usa:
Example1.java
ESERCIZI:
- Verificare cosa succede aggiungendo il metodo paint, come descitto nel paragrafo 10.4
- Recuperate un'mmagine .gif o .jpg dal WEB, e usatela come descritto nel paragrafo 10.4
- Fare gli esercizi alla fine del paragrafo 10.4
- Gestione di un evento: tre diversi approcci standard
Consideriamo il problema di progettare, seguendo l'architettura MVC, un applicazione che mostra quante volte e' stato premuto un bottone. La classe che realizza il Model Counter.java e la stessa per tutti e tre gli approcci.
- Una sola classe che realizza View e Controller
Frame2a.java
e una semplice classe di start-up: Example2a.java
- Una interfaccia
UpdatableView.java,
una classe per la View che la implementa
Frame2b.java,
una classe per il Controller
CountController.java,
e una semplice classe di start-up: Example2a.java
- Una classe che estende JButton e realizza il Controller
CountButton.java,
una classe che realizza la View
Frame2c.java
e una semplice classe di start-up: Example2c.java
Questa terza soluzione e' la piu' semplice. Osserviamo il suo "Class Diagram":
Architecture of Example2c
(NOTA: le parti relative alle interfacce dovrebbero essere in ITALICO,
ma qui non lo sono)
ActionListener <- - - - - - AWT/Swing classes that detect events
actionPerformed(ActionEvent e)
_^_
|
|
JButton <|--- CountButton ---------------------> Counter
actionPerformed(ActionEvent e) increment()
| countOf()
^
| |
v |
UpdateableView <|- - - - - - - - - Frame2c ---|> JFrame
update() update()
Consideriamo il problema di modificare l'applicazione aggiungendo un bottone che, quando premuto, causa la terminazione dell'applicazione.
E' possibile realizzare questa applicazione partendo dalla terza realizzazione dell'applicazione originaria e AGGIUNGENDO NUOVE CLASSI, ma LASCIANDO INALTERATE LE CLASSI ORIGINARIE.
Consideriamo: una classe che estende JButton e realizza il Controller per il nuovo bottone (NOTA: questa classe NON rimpiazza la precedente: nell'appicazione ci saranno DUE Controller, corrispondenti ai DUE bottoni)
ExitButton.java,
una classe che ESTENDE la nuova Wiew e realizza la nuova View
Frame3.java
e una semplice classe di start-up (completamente nuova):
Example3.java
Se poi vogliamo "abbellire" l'applicazione, permettendo la terminazione con un clic sulla "X" che si trova in alto a destra della finestra, e sufficiente aggiungere la classe (che realizza un TERZO controller)
ExitController.java
e aggiungere nel costruttore della classe Frame3 la riga di codice
addWindowListener(new ExitController());
ESERCIZI: Fare gli esecizi alla fine del paragrafo 10.5
Panel e Border
- Una classe che rappresenta un frame con border layout e panel
Frame4.java
una classe che rappresenta un panel che mostra un disegno
Drawing.java
e una semplice applicazione che le usa:
Example4.java
- Vediamo ora un'applicazione che mostra una semplice animazione.
L'archittetura è la seguente:
ThrobFrame
|
v
ColorButton ----> ThrobPanel <---- ThrobController
| |
v |
ThrobbingBall <----+
La classe che realizza il "Model" è:
ThrobbingBall.java
le classi che realizzano la "View" sono:
ThrobPanel.java (che disegna la palla su un panel) e
ThrobFrame.java (che disegna il panel e un bottone per cambiare colore su di un frame).
Il "Controller" è realizzato dalle classi:
ThrobController.java (il cui metodo run realizza l'animazione) e
ColorButton.java (che cambia iol colore della palla ogni volta che il bottone viene premuto).
La componente di startup è realizzata da:
StartThrob.java
Grid Layout
Scrolling List
Text Field
Segnalazione degli errori con i Dialog
Text Area e Menu
Uso degli Observers
"BEYOND THE BASICS"
- Applet
(ATTENZIONE: Una trattazione dettagliata dell'argomento si trova nel Capitolo 10 del libro "Java 2 i fondamenti".)
- Thread
-
Modifichiamo l'applicazione precedente in modo da mostrare due animazioni simultaneamente.
La prima modifica consiste nell'aggiungere
implements Runnable
all'header della classe ThrobController.
La nuova classe che mostra il frame è:
Throb2Frame.java (che disegna due panel).
La nuova componente di startup è realizzata da:
StartThrobs.java
-
Consideriamo ora un'applicazione che simula due venditori di biglietti.
Uno dei venditori è tre volte più veloce dell'altro.
Ogni venditore è modellato da un oggetto con un proprio thread di esecuzione;
questi oggetti condividono l'oggetto che modella i biglietti.
La classe che modella i biglietti è:
Tickets.java.
La classe che modella i venditori è:
SalesAgent.java.
La componente di startup è realizzata da:
StartTicketSales.java
(ATTENZIONE: Una trattazione dettagliata dell'argomento si trova nel Capitolo 1 del libro "Java 2 tecniche avanzate".)
|