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