Newsgroup: it.comp.java
Titolo: Creare un Animazione

Dovrei inserire all'interno di un BoxLayout un animazione che utilizzi
la classe Graphisc (lo so che le lable sarebbero meglio, ma non mi
consentono le sovrapposizioni).
per farlo ho fatto così:
/*in questa bozza l'unica cosa che cambia è lo sfondo*/
import javax.swing.Box ;
import javax.swing.BoxLayout ;
import javax.swing.JButton ;
import javax.swing.JToggleButton;
import javax.swing.JLabel ;
import java.awt.Dimension ;
import java.util.Timer;
import java.util.TimerTask;
public class PannelloBox extends Box {
        //stringa che conterrà il nome dell'immagine da
        //usare come sfondo
	String Sfondo;
        //una variaile per sapere quale è disegnato può valere 1 o 0
        int sfondo_attuale=0;
        //disegna è la classe che disegna lo sfondo
	disegna D;
        //il box è diviso in alto, centrale e basso
	Box alto = new Box(BoxLayout.X_AXIS) ;
	Box centrale = new Box(BoxLayout.X_AXIS) ;
	Box basso = new Box(BoxLayout.X_AXIS) ;
        //istanzio il Timer che mi servira per creare l'animazione
	Timer timer;
  public PannelloBox() {
    super(BoxLayout.Y_AXIS) ;
    //nella perte alta aggiungo dei bottoni
    alto.add(Box.createHorizontalGlue()) ;
    alto.add(new JButton("button 1")) ;
    alto.add(Box.createHorizontalGlue()) ;
    alto.add(new JButton("button 2")) ;
    alto.add(Box.createHorizontalGlue()) ;
    alto.add(new JButton("button 3")) ;
    alto.add(Box.createHorizontalGlue()) ;
    //associo il nome dello sfondo alla stringa
    Sfondo = "sfondo.jpg";
    //D è l'oggetto che disegna l'immagine
    D = new disegna(Sfondo);
    //D viene inserito nella perte centrale
    centrale.add(D);
    centrale.setPreferredSize(new Dimension(500,300)) ;
    centrale.setMaximumSize(new Dimension(500,300)) ;
    //une tichetta
    JLabel Etichetta=new JLabel("label 1");
   //nella perte bassa aggiungo dei bottoni
    basso.add(Box.createHorizontalGlue()) ;
    basso.add(new JToggleButton("button 4")) ;
    basso.add(Box.createHorizontalGlue()) ;
    basso.add(new JButton("button 5")) ;
    basso.add(Box.createHorizontalGlue()) ;
    basso.add(new JButton("button 6")) ;
    basso.add(Box.createHorizontalGlue()) ;
    //monto tutti gli elementi nel pannello
    this.add(Box.createVerticalGlue());
    this.add(alto) ;
    this.add(centrale) ;
    this.add(Etichetta) ;
    this.add(basso);
    this.add(Box.createVerticalGlue());
    //faccio partire il Timer che dovrebbe ridisegnare
    //l'immagine centrale della finestra per un
    //determinato numero di volte (in questo caso 5) al
    //secondo
    timer = new Timer();
    timer.schedule(new Ridisegna(), 0, 1000/5);
  }
    class Ridisegna extends TimerTask {
        public void run() {
    		//toglie D
        	centrale.remove(D);
                //ricrea D in modo che l'immagine
                //di sfondo si alternino
        	if(sfondo_attuale==0){
            	  Sfondo = "sfondo2.jpg";
            	  sfondo_attuale=1;
                }else{
            	  Sfondo = "sfondo.jpg";
            	  sfondo_attuale=0;
                }
 		D = new disegna(Sfondo);
                //inserisce il nuovo D nella perte centrale
    		centrale.add(D);
                centrale.validate();
        }
    }
}
questa classe funzione, ma rimuovendo ed aggiungendo l'immagine il
risultato non è un animazione fluida.
tra un frame e l'altro non c'è nulla e il risultato è che l'immagine
lampeggia...(oppure sono io che ho un distacco di retina)
c'è un modo per evitare che questo avvenga?
Ringrazio tutti coloro che hanno avuto la pazienza di leggere!
Marco

 c'è un modo per evitare che questo avvenga?
Ecco un esempio:
http://java.sun.com/docs/books/tutorial/2d/images/doublebuffering.html
Riguard le applet ma il concetto è identico.
pole
-- 
ammentos - a lightweight persistence framework for JDK5
http://www.sourceforge.net/projects/ammentos
http://ammentos.biobytes.it

mi ci è voluto un po' per arrivarci, ma alla fine c'è l'ho fatta!
grazie, non ci avevo proprio pensato!