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:

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:

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:

Figura dal sito java con le icone predefinite:

Due modi per usare JOptionPane:

  1. 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.
  2. 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: 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:

I parametri sono un sotto-insieme di quelli richiesti dal costruttore di JOptionPane (ved. modo 1), ma ha in piu':

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:

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).