Paola Magillo, Univestita' di Genova,
Corso di Programmazione II per SMID, a.a. 2006-2007.
Laboratorio 04 a:
INTERFACCIA GRAFICA PER ISTOGRAMMI
Il lavoro di questo laboratorio e'
in preparazione a realizzare quanto illustrato nella
lezione 9a.
Lo scopo e' ottenere semplicemente la visualizzazione di un istogramma
senza ancora tutte le operazioni previste nella lezione 9a.
Da che cosa partiamo
Sono fornite:
-
IstoPainter
= classe di componente Java a cui assegnare un istogramma
e questo sara' disegnato.
-
AnyRectangle
= interfaccia che stabilisce quali funzioni
una classe deve implementare per essere accettata come rettangolo.
-
AnyIstogram
= interfaccia che stabilisce quali funzioni
una classe deve implementare per essere accettata come istogramma.
-
SelectionListener.java
(per ora non usata, ma deve essere presente nella directory).
-
IstoDialog.java = finestra di dialogo
per chiedere all'utente i parametri delle operazioni
(per adesso ci interessa solo sapere che serve per chiedere
all'utente il nome del file).
-
ShowIsto.java
= finestra che contiene:
- un oggetto di classe IstoPainter per disegnare un istogramma
- barra di menu' con un menu' File contenente
le voci per caricare un istogramma (che viene disegnato),
salvare l'istogramma disegnato, e uscire dal programma
- una linea di messaggi per informare l'utente delle
operazioni compiute
Dettagli su queste classi e interfacce si trovano nella
lezione 9a,
Che cosa dobbiamo fare
(1) Implementare AnyRectangle e AnyIstogram
Scrivere una classe che implementi l'interfaccia
AnyRectangle.
Questa classe deve implementare tutti i metodi di AnyRectangle.
Prendere spunto dalle numerose varianti di rettangolo viste
(lezione 2 e
lezione 3).
Nota: per i nostri scopi, un rettangolo puo' avere lunghezza
negativa (per esempio troveremo lunghezze negative
in un istogramma che rappresenta
le temperature in gradi centrigradi nel corso dell'anno).
Scrivere una classe che implementi l'interfaccia
AnyIstogram.
Questa classe deve implementare tutti i metodi di AnyIstogram.
Sara' simile alla classe istogramma vista
nell'esercitazione.
Nota: nell'esercitazione si aggiungeva un rettangolo passando
all'istogramma solo la length (il rettangolo veniva costruito
dall'istogramma con la width prefissata).
Qui invece passiamo all'istogramma gia' il rettangolo
e l'istogramma deve modificare la sua width.
Il fatto che le due interfacce AnyRectangle e AnyIstogram
estendano Serializable ottiene che gli oggetti delle
classi che le implementano (cioe' i nostri rettangoli e i nostri
istogrammi) si possano leggere e scrivere su file.
Java fornisce meccanismi gia' pronti
per gestire la lettura/scrittura, li vedremo prossimamente.
(2) Far funzionare il visualizzatore
Partire dalla classe ShowIsto
fornita.
Se la eseguite cosi' come e' non visualizza nulla perche'
il programma e' impostato per disegnare l'istogramma nullo
(l'istogramma si trova nell'attributo is che attualmente e' posto
= null).
Provare a compilare ed eseguire la classe come e' e vedere
che cosa succede.
Bisogna creare un istogramma della vostra classe istogramma
e metterlo nell'attributo is invece dell'istogramma nullo.
Nel costruttore di ShowIsto,
a partire dalla linea 62 (marcata dal commento
PARTE DA MODIFICARE PER FAR FUNZIONARE IL PROGRAMMA):
- togliere l'istruzione is = null
- inserire al suo posto la costruzione di un istogramma
appartenente alla nuova classe che implementa l'interfaccia
AnyIstogram:
is = new nome_della_vostra_classe(...parametri...)
- stabilire la larghezza comune dei rettangoli nell'istogramma
usando il metodo setWidthForAll previsto dall'interfaccia
AnyIstogram:
is.setWidthForAll(....numero....)
- aggiungere a questo istogramma alcuni rettangoli
usando il metodo addRectangle previsto dall'interfaccia
AnyIstogram:
is.addRectangle(.......), naturalmente
ogni rettangolo va prima costruito con il costruttore della
vostra classe rettangolo
Provare a compilare ed eseguire la classe dopo le modifiche
e vedere che cosa succede.
(3) Usare il visualizzatore
Verificare che load e save funzionano, nel seguente modo:
-
Scegliere "Save" dal menu' File e
salvare l'istogramma scegliendo un nome file (per esempio "pippo").
-
Cambiare il modo in cui e' costruito
l'istogramma nel costruttore di ShowIsto (la parte che
avete scritto nel punto (2)) per esempio mettendo un rettangolo
in piu' o lunghezze diverse.
-
Uscire, ricompilare la classe ShowIsto e rieseguire:
l'istogramma disegnato sara' diverso.
-
Scegliere "load" dal menu' File e
caricare l'istogramma precedentemente salvato sul file "pippo".
Vedrete cambiare il disegno.
Note
Il file su cui Java salva l'istogramma e' in formato binario:
se provate a caricarlo in un editor non e' leggibile.
E' possibile rileggere un istogramma scritto solo se nel frattempo
non avete modificato le vostre classi per il rettangolo e l'istogramma.
Se le classi sono cambiate, Java non e' piu' in grado di
rileggere l'oggetto (di fatto l'oggetto che trova nel file
appartiene a un'altra classe).
(4) Provare a cambiare qualcosa nel visualizzatore
Se vi rimane tempo...
Nel costruttore di ShowIsto, dopo aver creato il pannello
disegna-istogramma (contenuto nell'attributo ip di classe
IstoPainter), vengono impostate alcune sue caratteristiche.
Provare a cambiarle.
-
Fattori di scala sugli assi x e y, assegnati con ip.setScaleX(...)
e ip.setScaleY(...).
-
Posizione dell'asse x, assegnata con ip.setXAxisPos(...),
il parametro e' un numero double che
corrisponde alla distanza dell'asse x dal bordo
inferiore del pannello, in percentuale sull'altezza dello stesso,
deve essere tra 0.0 e 100.0.
-
Se e dove vanno disegnati i valori delle lunghezze dei rettangoli,
stabilito con ip.setValuePos(....), in argomento sono
accettate le tre costanti IstoPainter.ABOVE, IstoPainter.BELOW e
IstoPainter.HIDDEN che corrispondono a disegnarli sopra, sotto,
o non disegnarli.