|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
[JAVA] Come far lampeggiare un'immagine
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..
Codice:
//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(); } } } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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 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 - Articolo 2 - Post del blog di Chet Haase
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 31-08-2009 alle 11:28. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Codice:
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 ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:02.