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