PDA

View Full Version : [JAVA] Come far lampeggiare un'immagine


alessia86
30-08-2009, 11:14
Vorrei provare a fare lampeggiare un'immagine..in parte ci sono riuscita..però non lampeggia bene..Vi scrivo il codice..forse c'è qualcosa che non va..



//NELLA CLASSE PANNELLO HO L'IMMAGINE CHE VOGLIO FAR LAMPEGGIARE:

public void setVar(boolean value){

this.stato=value;

}
public void paintComponent(Graphics g)
{
super.paintComponent(g);

if(stato)
g.drawImage(im,500,20,this);

Aggiorna a=new Aggiorna(this);
a.start();


}

public class Aggiorna extends Thread {
Pannello f;
public Aggiorna(Pannello f1) {
// TODO Auto-generated constructor stub
this.f=f1;

}
public void run()
{



try{


f.setVar(true);
f.repaint();

sleep(60);

f.setVar(false);
f.repaint();



}
catch(Exception e){
e.printStackTrace();
}


}


}

banryu79
31-08-2009, 12:17
C'e' un problema: fai eseguire delle operazioni su un componente grafico da un thread che non è l'EDT (il thread che, nell'architettura a thread singolo di AWT e Swing, si occupa di processare la coda degli eventi di AWT) e questo potrebbe generare delle race condition, in particolare quando un eventuale richiesta di aggiornamento della grafica da parte del sistema viene inoltrata e mandata in esecuzione proprio mentre il tuo altro thread esegue a sua volta delle operazioni sullo stesso componente.

Puoi ovviare facendo in modo che il tuo thread, invece di eseguire lui stesso le operazioni grafiche, le infili nella coda degli eventi.

In pratica prendi tutto il codice nel blocco try del tuo thread e lo infili in un Runnable che accodi con javax.swing.SwingUtils.invokeLater() [oppure java.awt.EventQueue.invokeLater(), e' la stessa cosa].
Solo una considerazione: mettere in sleep per 60 millisec l'EDT potrebbe non essere proprio il massimo.

In ogni caso se sei interessata alle animazioni grafiche, ti consiglio di leggere questo vecchio tutorial di PGI:
- Animazioni per pulsanti (http://www.hwupgrade.it/forum/showthread.php?t=1350780)

Potrebbe anche interessarti (io l'ho studiato e usato con grande soddisfazione) il "Timing Framework" realizzato da Cheat Haase.
Eccoti tre link: i primi due sono due articoli che spiegano i concetti base di questa astrazione più qualche dettagliuzzo sui Timer già presenti nel JDK standard; occhio che gli articoli fanno riferimento alla versione iniziale del framework (TimerController) e alla sua prima evoluzione (introduzione delle property e dell'interpolazione non lineare).
Il terzo link è a un'entry recente (2008) nel blog di Chet Haase dove trovi link utili per scaricare l'ultima versione della libreria, che contiene ulteriori novità (TimerController è diventato Animator; sono stati introdotti gli utilissimi Trigger).
Consigliata (soprattutto la lettura degli articoli, a scopo didattico, per capire l'astrazione).
- Articolo 1 (http://today.java.net/pub/a/today/2005/02/15/timing.html)
- Articolo 2 (http://today.java.net/pub/a/today/2006/03/16/time-again.html)
- Post del blog di Chet Haase (http://weblogs.java.net/blog/chet/archive/2007/09/aversion_10_its.html)

alessia86
05-09-2009, 17:01
public class Aggiorna implements Runnable{
Pannello f;
public Aggiorna(Pannello f1) {
// TODO Auto-generated constructor stub
this.f=f1;



}


//@Override
public void run() {
// TODO Auto-generated method stub

f.setVar(false);
f.repaint();

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

f.setVar(true);
f.repaint();

}

}

}

//QST E' LA CLASSE DOVE FACCIO L'EFFETTO PER IL LAMPEGGIAMENTO..POI

//LA RICHIAMO DA PANNELLO:


Runnable r=new Aggiorna(this);
EventQueue.invokeLater(r);







Cosi' però non mi visualizza proprio niente ;)