Lezione p06.pptx - Riccardo Cassinis

Programmazione Avanzata Java e C 2010-­‐2011 Lezione 6 Argomen9 vari Programmazione Avanzata Java e C
Lezione 6:
Argomenti vari
Sfarfallamento e componenti
11 ottobre 2010
Importantissimo da ricordare!
 paint() viene chiamato solo quando la JVM lo ritiene
opportuno
 Se noi modifichiamo la finestra dell’applet, la JVM non
può saperlo
 Dobbiamo esplicitamente chiedere che venga chiamato
 Usiamo il metodo repaint()
 Dopo la chiamata di repaint(), paint() viene chiamato
appena la JVM è in grado di farlo, il che non vuole
necessariamente dire immediatamente.
Lezione 6 Argomenti vari
11 o5obre 2010 11 ottobre 2010
© 2010 -­‐ 2012 Riccardo Cassinis -­‐ TuA i diriA riserva9 1 Programmazione Avanzata Java e C 2010-­‐2011 Lezione 6 Argomen9 vari Sfarfallio: attenzione al sistema
operativo!
 Anche se alcuni sistemi operativi eliminano
autonomamente lo sfarfallamento, ricordiamo che le
nostre applet gireranno su calcolatori di tipo diverso
 Dobbiamo in ogni caso eliminare lo sfarfallamento delle
applet che mostrano disegni in evoluzione dinamica
 Come si fa?
Lezione 6 Argomenti vari
11 ottobre 2010
3
Lo sfarfallìo - che fare?
 Secondo quanto vi ho detto, la sequenza degli eventi per
il redrawing è la seguente:
Repaint()
Lezione 6 Argomenti vari
11 o5obre 2010 paint(g)
11 ottobre 2010
© 2010 -­‐ 2012 Riccardo Cassinis -­‐ TuA i diriA riserva9 4
2 Programmazione Avanzata Java e C 2010-­‐2011 Lezione 6 Argomen9 vari Ma vi sarete chiesti…
 Come mai il disegno pre-esistente sparisce? (mi riferisco
ai cerchietti, nel nostro caso)
Lezione 6 Argomenti vari
11 ottobre 2010
5
11 ottobre 2010
6
In realtà…
 Le cose vanno un po’ diversamente:
Repaint()
update(g)
paint(g)
Lezione 6 Argomenti vari
11 o5obre 2010 © 2010 -­‐ 2012 Riccardo Cassinis -­‐ TuA i diriA riserva9 3 Programmazione Avanzata Java e C 2010-­‐2011 Lezione 6 Argomen9 vari Il metodo void update(Graphics g);
 Cancella la finestra in cui gira la applet, disegnando un
rettangolo con il colore dello sfondo grande quanto la
finestra stessa;
 Chiama il metodo paint;
 In verità le cose sono ancora più complesse ma per ora
accontentiamoci!
Lezione 6 Argomenti vari
11 ottobre 2010
7
Come procedere in pratica:
// Utilizziamo il meccanismo
//dell’off-screen drawing
//Definiamo un "foglietto" (globale)
//su cui disegnare
private Image offScreenImage;
Lezione 6 Argomenti vari
11 o5obre 2010 11 ottobre 2010
© 2010 -­‐ 2012 Riccardo Cassinis -­‐ TuA i diriA riserva9 8
4 Programmazione Avanzata Java e C 2010-­‐2011 Lezione 6 Argomen9 vari Inizializzazione
public void start() {
/*
inizializziamo il nostro "foglietto”,
ma attenzione! possiamo farlo solo
dopo il completamento del metodo init
*/
offScreenImage = createImage
(getSize().width,getSize().height);
}
A priori non conosciamo le dimensioni della
finestra in cui gira l’applet
Lezione 6 Argomenti vari
11 ottobre 2010
9
Sovrascriviamo update
//Sovrascriviamo il metodo update(Graphics g)
public void update(Graphics g) {
//accertiamoci che il "foglietto" esista!
if (offScreenImage != null) {
//offScreenGraphics è la porta grafica su cui dovremo disegnare
//deve essere quella appartenente all'oggetto offScreenImage
Graphics offScreenGraphics = offScreenImage.getGraphics();
//il colore dello sfondo deve essere quello della finestra "reale”
offScreenGraphics.setColor(getBackground());
//cancelliamo il foglietto, disegnando un rettangolo del colore
//dello sfondo grande tanto quanto la finestra
offScreenGraphics.fillRect
(0, 0, getSize().width, getSize().height);
//rimettiamo a posto il colore
offScreenGraphics.setColor(g.getColor());
//disegnamo tutto, ma sul "foglietto”
paint(offScreenGraphics);
//quando abbiamo finito, trasferiamo in un colpo solo tutta
//l'immagine sulla finestra vera:
g.drawImage(offScreenImage, 0, 0, this);
}
}
Lezione 6 Argomenti vari
11 o5obre 2010 11 ottobre 2010
© 2010 -­‐ 2012 Riccardo Cassinis -­‐ TuA i diriA riserva9 10
5 Programmazione Avanzata Java e C 2010-­‐2011 Lezione 6 Argomen9 vari In conclusione:
 La finestra non viene mai cancellata, solo ridisegnata
pixel per pixel
 I pixel che devono rimanere uguali rimangono
effettivamente uguali, mentre prima per un attimo
assumevano il colore dello sfondo
 I pixel che devono cambiare cambiano senza
“incertezze”
 L’operazione è molto più rapida, perché tutti gli
eventuali calcoli della paint sono già stati fatti: si tratta
solo di copiare dei pixel
Lezione 6 Argomenti vari
11 ottobre 2010
11
Per documentarsi:
 http://java.sun.com/j2se/1.3/docs/guide/2d/spec/j2dimage.fm3.html
Lezione 6 Argomenti vari
11 o5obre 2010 11 ottobre 2010
© 2010 -­‐ 2012 Riccardo Cassinis -­‐ TuA i diriA riserva9 6 Programmazione Avanzata Java e C 2010-­‐2011 Lezione 6 Argomen9 vari Seconda parte: I componenti
 Operazioni standardizzate richiedono componenti
standardizzati:
 
Pulsanti
•  Button
•  Checkbox
•  Checkbox groups, detti anche radio button (CheckboxGroup)
 
Caselle di testo
•  Fisso (Label)
•  Editabile (TextArea, TextField)
 
 
 
Menu a tendina (Choice)
Scrollbar
"Fogli" per disegnare (Canvas)
Lezione 6 Argomenti vari
11 ottobre 2010
13
E inoltre:
 Meccanismi per disporli nella finestra (Layout Manager)
 
 
 
 
FlowLayout
BorderLayout
GridLayout
(null Layout)
 Gruppi di componenti: i Panel
Lezione 6 Argomenti vari
11 o5obre 2010 11 ottobre 2010
© 2010 -­‐ 2012 Riccardo Cassinis -­‐ TuA i diriA riserva9 14
7