Paola Magillo, Univestita' di Genova,
Corso di Programmazione II per SMID, a.a. 2006-2007.
Laboratorio 04 b:
INTERFACCIA GRAFICA PER ISTOGRAMMI
Il lavoro di questo laboratorio intende realizzare una parte di
quanto illustrato nella lezione 9a.
Da che cosa partiamo
Nel laboratorio precedente
(laboratorio 4a) abbiamo ottenuto
un'interfaccia grafica che carica, visualizza, salva un istogramma.
Partiamo da li'.
Attenzione: errata corrige
-
Il file ShowIsto.java
conteneva due volte (alle linee 48 e 49) l'istruzione
bar.add(fileMenu); -- non fa danno ma e' inutile --
potete toglierla anche dal file che avete modificato;
gia' che ci siete potete anche togliere le chiamate a
System.out.println (inutili) presenti nel file
-
Scaricate la versione corretta del file
IstoPainter.java
-- il nome della funzione getXAxis era scritto
senza X, non c'e' da cambiare nient'altro perche' questa
funzione non e' ancora usata da nessun altro file
-
Nella lezione 9a
i nomi delle funzioni getXAxis e setXAxis (nella descrizione della
classe IstoPainter) erano scritti senza X -- cambiate solo quello,
non occorre ristampare il file!!!
Che cosa dobbiamo fare
(1) Aggiungere all'interfaccia i menu'
Vedere lezione 9a
per la spiegazione dettagliata dei menu' da aggiungere.
Qui facciamo un riassunto:
- Menu' Edit (per modificare l'istogramma) con voci:
- Add rectangle (per aggiungere rettangolo in fondo)
- Remove rectangle (per cancellare ultimo rettangolo)
- Set rectangle length (per cambiare la lunghezza del
rettangolo selezionato se esiste) [*]
- Menu' View (per modificare il modo in cui l'istogramma
e' disegnato) con voci:
- Default color (per cambiare colore di default)
- Rectangle Color (per cambiare colore del rettangolo selezionato
se esiste) [*]
- Show values (per decidere se e dove mostrare i valori delle
lunghezze dei rettangoli), questa voce e' un sottomenu'
che ha voci above, below, hidden (sopra, sotto, nascondi)
- Scale factors (per cambiare i fattori di scala usati sulle
x e sulle y)
- X axis (per cambiare la posizione dell'asse x nella finestra)
- Menu' Function (per calcolare caratteristiche dell'istogramma)
con voci corrispondenti alle cose che avete imparato a calcolare
nei corsi di statistica: media, varianza.... a vostra scelta.
In questo laboratorio costruiamo soltanto i menu' senza assegnare
loro i comportamenti, a parte quello di cui al punto (2).
Per la costruzione dei menu' ricalcare la costruzione del menu'
File gia' presente.
Notare che:
- le voci di menu' sono attributi della classe ShowIsto
(ho bisogno di "vederli" da dentro i listener)
- i menu' invece sono variabili locali al costruttore
(servono solo per costruire il menu' e metterlo sulla barra)
Le voci segnate con [*] devono essere inizialmente disabilitate:
chiamare su di esse il metodo setEnabled(false).
(2) Selezione e disselezione del rettangolo
Mandate in esecuzione il programma interfaccia grafica (ShowIsto) e
provate a cliccare sull'istogramma visualizzato.
Vedrete che:
- se cliccate su un rettangolo i suoi contorni vengono evidenziati,
cio' significa che e' stato selezionato
- se cliccate su un altro rettangolo, il rettangolo eventualmente
selezionato prima si disseleziona e viene selezionato questo
- se cliccate sullo sfondo, il rettangolo eventualmente selezionato
si disseleziona e non viene selezionato nulla
Questo e' il comportamento di default previsto nella classe di
dispositivo IstoPainter per la selezione.
A questo comportamento predefinito aggiungiamo un comportamento
definito da noi.
Vogliamo che all'atto della selezione:
-
se e' stato selezionato un rettangolo, le voci di menu'
segnate con [*] si abilitino -- setEnabled(true).
-
se e' stato selezionato nulla, le voci di menu'
segnate con [*] si diabilitino -- setEnabled(false).
Per fare questo aggiungiamo all'oggetto di classe IstoPainter
(contenuto nell'attributo ip), tramite la funzione
addSelectionListener, un oggetto di nostra classe che implementi
l'interfaccia SelectionListener.
Guardare il file SelectionListener.java per vedere come si chiama
la funzione che deve essere implementata.
Per sapere che cosa e' stato selezionato basta chiamare
ip.getSelectedRectangle() e vedere se il rettangolo ritornato
e' esistente oppure null.