Paola Magillo, Univestita' di Genova, Corso di Programmazione II per SMID, a.a. 2009-2010.

Lezione 13:

CASO DI STUDIO: GESTIONE DI UN DATA BASE DI ABBONATI - PARTE 2

Vediamo l'interfaccia utente grafica dell'esempio che verra' poi usato nell'esame. Per adesso vediamo quella per l'utente abbonato.

Dal punto di vista dell'utente

L'interfaccia grafica per l'utente abbonato e' composta da una finestra che chiede l'autenticazione (login) e da altre due finestre, rispettivamente per mostrare i dati relativi all'utente stesso come abbonato, e per cambiare la password.

Tutte le finestre dell'interfaccia sono finestre di dialogo. Infatti nessuna di queste ha la prevalenza sulle altre quanto a durata dell'interazione con l'utente.

Finestra di login

finestra di login

Inizialmente compare la finestra di login che chiede cognome, nome, anno di nascita e password dell'utente.
Questa finestra pur essendo una finestra di dialogo non dipende da altre finestre.

Vi sono tre bottoni corrispondenti alle operazioni possibili:

  1. chiudi -- esce dal programma
  2. accedi -- permette di accedere ai propri dati di abbonato nel data base
  3. cambia password -- permette di cambiare la password

Se l'utente sceglie "accedi" allora il programma controlla che cognome, nome, anno di nascita e password corrispondano a quelli di un abbonato nel data base. In caso di errore mostra una finestra col messaggio di errore. In caso ok carica l'abbonato e lo mostra nella finestra di dati.

Se l'utente sceglie "cambia password" allora il programma controlla che cognome, nome, anno di nascita e password corrispondano a quelli di un abbonato nel data base. In caso di errore mostra una finestra col messaggio di errore. In caso ok mostra la finestra di cambio password.

Finestra dei dati

finestra dei dati La finestra dei dati dipende dalla finestra di login ed e' modale (cioe' impedisce l'interazione con la finestra chiamante). Mostra tutti i dati dell'abbonato, ma lascia modificare solo indirizzo, telefono, email.

Vi sono tre bottoni corrispondenti alle operazioni possibili:

  1. chiudi -- nasconde questa finestra e riabilita l'interazione con la finestra di login
  2. salva -- se sono avvenute modifiche salva l'abbonato nel data base, altrimenti avverte con un messaggio che non c'e' nulla da salvare
  3. ricarica -- ricarica l'abbonato dal data base perdendo eventuali modifiche intercorse

Finestra di cambio password

finestra di cambio password

La finestra di cambio password chiede all'utente la nuova password, due volte per essere sicuri da eventuali errori di battitura.

Vi sono due bottoni corrispondenti alle operazioni possibili:

  1. chiudi -- non cambia la password, nasconde questa finestra e riabilita l'interazione con la finestra di login
  2. conferma cambio -- controlla che le due stringhe immesse siano non vuote ed uguali; se lo sono allora cambia la password salvandola nel data base; altrimenti mostra un messaggio di errore e non cambia la password; in ogni caso nasconde questa finestra e riabilita l'interazione con la finestra di login

Riassumendo

Il diagramma seguente illustra il funzionamento dell'interfaccia.
I riquadri rettangolari sono finestre.
Le frecce sono azioni eseguite dall'utente nella finestra da cui la freccia parte.
I riquadri con angoli arrotondati sono operazioni fatte dal programma in risposta all'azione dell'utente.
Non sono indicate nel diagramma le finestre di errore...

Dal punto di vista del codice Java

Tutte le finestre sono realizzate con la classe Finestra, sotto-classe di JDialog.

Le finestre di questa classe sono gestite con border layout. Sono predisposte con al centro lo spazio per mettere un componente (in pratica sara' un pannello), e in basso un pannello organizzato con flow layout che contiene il bottone "chiudi", ma predisposto per aggiungere altri bottoni. Queste finestre sono modali.

Vi sono poi classi che realizzano i pannelli che saranno collocati al centro delle finestre, e definiscono quali bottoni aggiuntivi vi saranno:

Le finestre vengono costruite cosi':

Classi Java per l'interfaccia grafica

Tutte le classi che costituiscono questo esempio sono predisposte per essere documentate con Javadoc (vedere lezione 11). Scaricare tutti i file java nella directory corrente e poi digitare "javadoc *.java", genera documentazione per tutte le classi, il file da cui partire (con l'indice) e' poi quello di nome "index.html".

Qui diamo solo un inquadramento generale delle classi, a che cosa servono, che collegamenti hanno fra loro. Per tutti gli altri dettagli si rimanda alla documentazione javadoc.

Le classi per il data base sono descritte nella lezione 12, qui documentiamo solo quelle per l'interfaccia grafica (che usano le precedenti).

Classe Finestra

Finestra.java

Realizza tutte le finestre.

Definisce il layout a border, lascia la parte al centro vuota (ma definisce la funzione mettiInCentro con cui la potro' riempire), mette a sud un pannello con per adesso solo il bottone "chiudi" (ma definisce la funzione mettiInBasso con cui ne potro' aggiungere altri).
Queste due funzioni mettiInCentro e mettiInBasso sono chiamate dalla classe principale ProgrammaAbbonato per costruire effettivamente le finestre (tutte di classe Finestra ma con elemento diverso al centro e diversi bottoni nel pannello in basso).

Classe PannelloLogin

PannelloLogin.java

Realizza il pannello che sara' collocato al centro della finestra di login.

Organizzato a griglia 4x2 con 4 etichette esplicative e campi di testo di cui l'ultimo oscurato (classe JPasswordField), per cognome, nome, anno di nascita, password.
Crea e memorizza i bottoni aggiuntivi "accedi" e "cambia" (senza metterli ancora da nessuna parte, sono da mettere poi nella finestra).

Ha due metodi per ritornare i dati personali e la password (immessi dall'utente nei campi di testo).

Classe PannelloCambia

PannelloCambia.java

Realizza il pannello che sara' collocato al centro della finestra di cambio password.

Organizzato a griglia 2x2 con 2 etichette esplicative e campi di testo oscurati per le due copie della nuova password.
Crea e memorizza il bottone aggiuntivo "conferma cambio" (da mettere poi nella finestra).

Ha un metodo che controlla se la nuova password e' stata immessa correttamente, e in caso affermativo la ritorna.

Classe PannelloInfo

PannelloInfo.java

Pannello per contenere i dati di una coppia persona, abbonamento (oggetto di classe InfoBase).
Super-classe qui di PannelloDati, e nell'interfaccia grafica per il gestore (ved. prossima lezione) dei pannelli incaricati di raccogliere i parametri di ricerca, mostrare gli abbonati risultanti dalla ricerca, chiedere i dati per la creazione di un nuovo abbonato.

Contiene (oltre ad etichette esplicative) campi di testo per ognuna delle informazioni associate alla persona titolare e al suo abbonamento, eccetto che per la categoria di abbonamento, rappresentata da tre bottoni radio. Tuttavia i bottoni radio non sono ancora resi mutuamente esclusivi (aggiungendoli allo stesso button group). Nelle sotto-classi alcuni campi saranno disabilitati per impedire all'utente di cambiarne il contenuto.
Crea e memorizza i bottoni aggiuntivi "salva" e "ricarica" (da mettere poi nella finestra).

Ha funzioni per scrivere nel pannello i dati di un oggetto di classe InfoBase, per prelevare dal pannello i dati e restituirli come oggetto di classe InfoBase, e per cancellare i campi del pannello (ma solo quelli corrispondenti alle informazioni che l'utente puo' editare, in base allo stato delle abilitazioni).

Classe PannelloDati

PannelloDati.java

Sotto-classe di PannelloInfo, realizza il pannello che sara' collocato al centro della finestra di dati.

Rende tutti i campi di testo non editabili tranne quelli per indirizzo, telefono ed email, e disabilita i tre bottoni radio.
Crea inoltre e memorizza i bottoni "salva" e "ricarica".

Classe Programma

Programma.java

Super-classe delle due interfacce grafiche per l'utente abbonato (che stiamo vedendo qui) e per l'utente gestore (che vedremo nella prossima lezione.

Tutti gli attributi e i metodi di questa classe delle due sotto-classi sono di classe (static). L'idea e' che tanto ci sara' un solo programma in esecuzione, quindi non siamo interessati a creare piu' istanze.

Memorizza come attributo l'utente (dichiarato come di classe Utente, ma sara' un oggetto della sotto-classe UtenteAbbonato o UtenteGestore).

Definisce funzioni per alcune operazioni che dovranno essere fatte sia nell'interfaccia per l'utente abbonato che in quella per l'utente gestore. Queste operazioni hanno come parametri una finestra f di classe Finestra e un pannello p di classe PannelloInfo: lavorano sull'abbonato correntemente selezionato nell'utente sotto-stante, le cui informazioni sono mostrate nel pannello p, ed eventuali errori sono mostrati in una finestra di errore che dipende dalla finestra f.

Precisamente sono definite funzioni per:

Classe ProgrammaAbbonato

ProgrammaAbbonato.java

Sotto-classe di Programma, realizza tutta l'interfaccia grafica per l'utente abbonato.

Costruisce le tre finestre: ciascuna e' un'istanza di Finestra con al centro un pannello della classe opportuna, e con in basso aggiunti i bottoni memorizzati in tale pannello.

Stabilisce tutte le callback di tutti i bottoni presenti nelle tre finestre: il bottone "chiudi" memorizzato nella finestra e i bottoni aggiuntivi memorizzati nei vari pannelli (ma aggiunti alla finestra).

Per far funzionare il tutto

Servono:

Tutti i link per scaricare anche in formato zip si trovano nelle pagine del laboratorio.

Per compilate e' sufficiente digitare: javac ProgrammaAbbonato.java

Per eseguire digitare: java ProgrammaAbbonato Pippo