Paola Magillo, Univestita' di Genova,
Corso di Programmazione II per SMID, a.a. 2009-2010.
Laboratorio 09:
ESERCIZI SUL CASO DI STUDIO DATA BASE ABBONAMENTI - PARTE III
In questi esercizi vediamo le classi che fanno parte
dell'applicazione Java usata poi per l'esame
(vedere lezione 12,
lezione 13
e lezione 14).
1) Scaricare il materiale
Prendere tutto il materiale indicato nel
laboratorio 7
(compresa la directory del data base Pippo),
tutto il materiale indicato nel
laboratorio 8
e in piu'...
Prendere le classi:
Oppure prenderle tutte insieme in formato .zip:
Mettere tutti questi file (dei tre laboratori) nella stessa directory.
2) Generare la documentazione
Generare con javadoc la documentazione di tutte queste classi.
Basta metterle tutte nella directory corrente e poi lanciare
javadoc *.java.
Visualizzare la documentazione. Basta cliccare per aprirlo sul file
principale di quelli generati da javadoc, che si chiama index.html
(si trova nella directory corrente).
3) Esercizi facili
Questi esercizii sono molto piu' facili di quelli da esame.
Nella finestra di scelta iniziale aggiungere un'immagine (es. un logo).
Suggerimenti:
- le modifiche interessano la classe PannelloScelta.
Nella finestra risultati, visualizzare in rosso tutti gli abbonati il
cui abbonamento scade questo mese (12/2009).
Suggerimenti:
Nella classe PannelloRisultato ridefinire la funzione
mettiInfo, ereditata dalla super-classe PannelloInfo,
facendole eseguire tutto quello che eseguiva prima (chiamando
super.mettiInfo) e
in piu' cambiando il colore di foreground dei campi di testo se
il mese/anno della scadenza dell'abbonamento sono 12/2009.
4) Esercizi piu' difficili
Questi esercizi sono paragonabili a esercizi da esame,
ma all'esame saranno dati meno suggerimenti.
Quelli con [!] sono anche un po' piu' difficili di quelli da esame.
TRANNE quando viene detto espressamente, i vari esercizi
sono INDIPENDENTI fra loro e ognuno deve partire dai file nella versione
ORIGINALE scaricata dal sito web.
Questo esercizio e' una variante/prosecuzione dell'ultimo esercizio "facile"
appena visto.
Aggiungere nella finestra di scelta iniziale due campi di testo
per chiedere il mese e l'anno correnti: il bottone "ricerca" non fa
apparire la finestra corrispondente se questi due campi non sono stati
compilati e/o non contengono valori corretti.
Suggerimenti:
-
I due campi vanno aggiunti nella classe PannelloScelta,
va aggiunta nella stessa classe anche una funzione che
esegue il controllo sui campi e due funzioni per ritornare il mese
e l'anno inseriti.
-
Queste funzioni vanno chiamate nella callback del bottone "ricerca"
(che viene definita nella funzione "prepara" nella classe ProgrammaGestore).
-
Il mese e l'anno cosi' acquisiti devono essere memorizzati in due
attributi (da aggiungere) nella classe ProgrammaGestore.
-
Nella classe PannelloRisultato, la ridefinita funzione
mettiInfo (ved. esercizio "facile" precedente) avra' due parametri aggiuntivi:
mese ed anno correnti. Ed usera' questi (non piu' 12 e 2009) per
decidere se mettere in rosso i campi di testo.
-
Nella chiamata a questa nuova funzione mettiInfo (che avviene dentro la
funzione mostraRisultato di classe ProgrammaGestore),
aggiungere questi due parametri:
sono il contenuto delle due nuove variabili aggiunte alla classe
ProgrammaGestore.
Nella versione data, un abbonato e' riportato come risultato della ricerca
se soddisfa TUTTI i requisiti imposti dal criterio di ricerca.
Fare una versione che riporta come risultati tutti gli abbonati che
soddisfano ALMENO UNO dei requisiti.
Suggerimenti:
- Bisogna modificare la funzione "corrisponde" della classe Criterio.
[!]
Variante/aggiunta dell'esercizio precedente:
per ogni abbonato contare QUANTI
sono i requisiti del criterio di ricerca che esso soddisfa.
Riportare come risultato gli abbonati che ne superano almeno uno.
Nel pannello risultati mostrare quanti sono i requisiti soddisfatti.
Suggerimenti:
- Modificare la funzione "corrisponde"
della classe Criterio, il cui valore di ritorno diventa "int"
(non piu' "boolean").
- Nella classe DataBase, laddove e' chiamata la funzione
"corrisponde", controllare se il risultato e' >= 1
(ora controlla se e' true).
- Aggiungere nella classe PannelloInfo (super-classe di PannelloRisultato)
un'etichetta
per ospitare il numero di requisiti soddisfatto, la
si puo' mettere nell'ultima riga a destra (ora vuota).
Siccome questo elemento serve solo nella sotto-classe PannelloRisultato,
lo possiamo rendere invisibile, e poi sara' reso visibile in
PannelloRisultato (viene ereditato da tutte le sotto-classi di
PanelloInfo, incluse PannelloCriterio e PannelloNuovo, dove non lo
vogliamo; renderlo visibile serve per questo). [*]
- In PannelloRisultato, rendere visibile l'etichetta di cui sopra.
Inoltre ridefinire la funzione "mettiInfo" (ereditata da PannelloInfo)
che avra' un altro argomento: il criterio di ricerca. Deve eseguire
tutto quello di prima (basta chiamare la vecchia "mettiInfo" senza
l'argomento criterio), e in piu' chiamare sul criterio "corrisponde"
e mettere il numero risultante nel nuovo campo di testo.
- Nella classe ProgrammaGestore, laddove "mettiInfo" e' chiamata
(funzione "mostraRisultato"),
recuperare il criterio, chiamando, come nella callback del
bottone btCerca:
Criterio cr = new Criterio(panCriterio.prendiInfo(false));
e passarlo come argomento in piu' (assieme al risultato corrente
utente.copiaSelezionato() che c'e' gia'),
alla funzione "mettiInfo".
Nota [*]: si potrebbe pensare di mettere l'etichetta per il numero di
requisiti soddisfatti direttamente in PannelloRisultato. Il problema e' che
qui non abbiamo modo di accedere al pannello ausiliario destra2,
che compare nel costruttore di PannelloInfo, e al quale noi dovremmo
aggiungere questo nuovo elemento.
Ci sono altri modi di aggirare il problema, oltre a quello indicato
(per es. rendere destra2 un attributo protected in PannelloInfo).
[!]
Nella finestra risultati, colorare in verde le scritte dei campi che
corrispondono ai criteri di ricerca impostati.
Esempio:
se ho impostato anno di rilascio = 2009, ottengo tutti gli abbonati
il cui abbonamento e' stato rilasciato nel 2009, mentre tutti gli altri campi
hanno qualsiasi valore: scrivo in verde l'anno di rilascio (e in nero
come adesso gli altri campi).
Suggerimenti:
-
Nella classe Criterio, aggiungere una funzione booleana per ogni
requisito del criterio: praticamente si tratta di estrapolare dal codice
della funzione "corrisponde" tante funzioni:
"corrispondeCognome, corrispondeNome, ecc...".
Queste funzioni devono pero' ritornare true se:
il requisito ESISTE E e' soddisfatto. Mentre nel codice della
funzione "corrisponde" si va avanti se il il requisito NON ESISTE
O e' soddisfatto.
In pratica la funzione corrispondeNome deve ritornare false
se il criterio non specifica un nome o se il
nome e' diverso da quello del criterio, e true altrimenti;
analogamente le altre.
-
- Nella classe PannelloRisultato aggiungere una funzione "mettiInfo"
che prende come argomento anche un criterio.
Deve fare tutto quello che fa l'altra funzione "mettiInfo"
(basta chiamarla) e in piu' chiamare sul criterio le varie funzioni
"corrispondeCognome", "corrispondeNome", ecc..., controllare che cosa
ritornano (true o false), e in base a questo
mettere verde o nero il colore di foreground del campo corrispondente.
-
- Nella classe ProgrammaGestore, laddove si chiama "mettiInfo"
(funzione "mostraRisultato"),
recuperare il criterio, chiamando, come nella callback del
bottone btCerca:
Criterio cr = new Criterio(panCriterio.prendiInfo(false));
e passarlo come argomento in piu' (assieme al risultato corrente
utente.copiaSelezionato() che c'e' gia'),
alla funzione "mettiInfo".