Paola Magillo, Univestita' di Genova,
Corso di Programmazione II per SMID, a.a. 2009-2010.
Laboratorio 04 Bis:
AGGIUNGIAMO UNA FINESTRA DI DIALOGO ALLA
INTERFACCIA GRAFICA PER IL CRIVELLO DI ERATOSTENE
Partiamo dall'interfaccia grafica per il crivello di eratostene
realizzata nel laboratorio 4.
Invece di chiedere il parametro K sulla command-line,
aggiungiamo una finestra di dialogo iniziale.
L'interfaccia avra' due finestre:
-
La finestra principale, come ora, che pero' sara' creata e visualizzata
non alla partenza del programma, ma DOPO
-
Una finestra di dialogo, che appare alla partenza del programma e
chiede il parametro K
-
DOPO che l'utente ha immesso questo parametro,
verra' nascosta la finestra di dialogo e verra' creata e visualizzata
la finestra principale.
Nota: questo e' un caso eccezionale di finestra di dialogo che appare
quando la finestra principale dell'applicazione non esiste ancora.
Siccome nel costruttore di una finestra di dialogo occorre
specificate da quale finestra essa deve dipendere, in questo caso
mettiamo null (non dipende da nessuna altra finestra).
La finestra di dialogo iniziale dovra' contenere:
-
etichetta esplicativa (es. "Quanti numeri primi vuoi trovare:").
-
campo di testo (per immettere una stringa, che deve rappresentare
un numero K)
-
almeno un bottone per chiudere la finestra ("ok" che fa partire
la finestra principale con valore di K quello immesso),
eventualmente anche due ("cancel" per terminare
direttamente l'applicazione)
La potete realizzare o con JDialog, oppure con JOptionPane...
Con JDialog
Vedere esempio ExJDialog.java in
lezione 9.
La callback del bottone che chiude la finestra di dialogo deve:
controllare se la stringa digitata rappresenta un numero intero
>=1.
In caso affermativo nascondere la finestra di dialogo, creare
la finestra principale passando tale numero al costruttore della
classe ViewPNG, e mostrare la finestra principale.
Se la stringa non rappresenta un numero (potete catturare l'eccezione
generata da Integer.parteInt) allora la finestra
di dialogo rimane aperta e l'utente dovra' ritentare
(per farglielo capire potete per es. cancellare il campo di testo,
scriverci dentro che ci vuole un intero>=1, o scriverlo nell'etichetta
esplicativa, o fare un bip, ecc.).
Con JOptionPane
JOptionPane permette di creare facilmente finestre di dialogo
standard. In particolare e' previsto che ci siano:
-
un messaggio (stringa) che scelgo io.
-
un'icona (facoltativa)
che posso fornire io oppure scegliere
tra un insieme di icone che JOPtionPane ha predefinite
(errore, informazione, avvertimento, domanda, nessuna icona).
-
un numero variabile di bottoni per chiudere la finestra,
a cui posso dare etichette io
oppure usare combinazioni prefedinite (ok, ok/cancel, yes/no/cancel),
e posso anche scegliere se uno deve essere il bottone di default.
-
un titolo (stringa) che apparira' sulla barra del titolo.
Figura dal sito java con le icone predefinite:
Due modi per usare JOptionPane:
-
Creo finestra di classe JDialog, creo pannello di classe JOptionPane
e lo metto al posto del pannello di contenuto della finestra di dialogo,
poi mostro la finestra di dialogo.
-
Uso funzioni predefinite che creano al volo una finestra di dialogo
con dentro un pannello di classe JOptionPane, la mostrano a schermo finche'
l'utente non la chiude, e ritornano con quale bottone la finestra e'
stata chiusa.
Segue descrizione generale dei due modi, per dettagli sulla sintassi
vedere la classe JOptionPane nel manuale
on-line di Java.
Il secondo modo e' piu' comodo!
Primo modo
Esempio:
final JOptionPane op = new JOptionPane(.....);
final JDialog dialog = new JDialog(.....);
dialog.setContentPane(op);
dialog.pack();
dialog.setVisible(true);
Il costruttore generale della classe JOptionPane ha la forma:
JOptionPane(Object message, int messageType, int optionType, Icon icon,
Object[] options, Object initialValue)
dove:
-
message: la stringa messaggio
-
messageType:
determina l'icona di default, una fra le costanti:
ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE
PLAIN_MESSAGE (= nessuna icona)
-
optionType:
definisce l'insieme di bottoni, una fra le costanti:
DEFAULT_OPTION
YES_NO_OPTION
YES_NO_CANCEL_OPTION, OK_CANCEL_OPTION
-
icon: icona caricata da file, nel caso non usi una di quelle predefinite
(ved. messageType)
-
options: array di stringhe o icone che devono apparire sui bottoni,
nel caso non usi uno degli insiemi di bottoni predefiniti (ved. optionType),
la lunghezza dell'array definisce quanti sono i bottoni
-
initialValue: il bottone, tra quelli forniti, che deve essere inizialmente
selezionato
Esistono costruttori con solo alcuni di questi parametri (in particolare
senza gli ultimi due o tre parametri).
Inoltre bisogna associare una callback al / ai bottoni presenti
sul pannello, ovvero sulla finestra di dialogo.
Attenzione: per default premendo sui bottoni la finestra NON si chiude!
Siccome non abbiamo accesso diretto ai bottoni, questo si ottiene
associando un PropertyChangeListener al pannello
(vedere sul manuale on-line, attenzione bisogna importare il package
java.beans).
Secondo modo
Le funzioni predefinite creano e mostrano al volo le seguenti
tipologie di finestre di dialogo:
-
showConfirmDialog -- chiede conferma: mostra messaggio e
tre bottoni tipo yes/no/cancel.
-
showInputDialog -- chiede una stringa: mostra messaggio
e due bottoni tipo ok/cancel.
-
showMessageDialog -- messaggio: mostra messaggio e un bottone tipo ok
-
showOptionDialog -- generalizza le tre precedenti (posso scegliere numero di
bottoni e che etichette devono avere, ecc. come nell'option panel del primo
modo)
I parametri sono un sotto-insieme di quelli richiesti dal costruttore di
JOptionPane (ved. modo 1), ma ha in piu':
- la finestra da cui deve dipendere
- il titolo da mostrare sulla barra del titolo
Le finestre sono tutte modali (impediscono l'interazione con la finestra
chiamante finche' non vengono chiuse) e i bottoni presenti le chiudono
(comportamento predefinito).
Le funzioni show....
non ritornano fino a che l'utente non ha chiuso la finestra di
dialogo.
Quando l'utente chiude la finestra,
ritornano un valore corrispondente alla scelta fatta dall'utente:
- showConfirmDialog -- intero che rappresenta il bottone selezionato
- showInputDialog -- la stringa immessa (null se l'utente ha chiuso la
finestra con cancel)
- showMessageDialog --
- showOptionDialog -- intero che rappresenta il bottone selezionato
E per rappresentare il bottone selezionato esistono le costanti:
OK_OPTION, YES_OPTION,
NO_OPTION, CANCEL_OPTION, CLOSED_OPTION (= finestra chiusa con la
"x" sul bordo).