Newsgroup: it.comp.java
Titolo: Gestione Immagini in movimento con l'uso dei Thread

Ciao a tutti,
 ho realizzato una classe che visualizza delle immagini che si muovono in un jpanel,
 il mio problema e' che non so gestire la corretta visualizzazine delle immagini,
 infatti queste si muovono a scatti o sono troppo lente.
 Non so come gestirle attraverso un uso corretto dei thread.
 Cerchero' di descrivervi la procedura della classe:
 dopo che si č creato il JPanel, 
 vengono istanziate tante classi (che estendo Thread) per ogni immagine,
 queste classi hanno un metodo run() (che cicla all'infinito) che calcola la posizione 
 delle ordinate e delle ascisse,
 e che chiama repaint sul Jpanel, per ogni iterazione del ciclo.
 all'interno di JPanel c'e' solo paintComponent sincronizzato che
 per ogni immagine creata chiama drawImagine().
 facendo delle prove (ho messo un wait() all'interno di paintComponent) ho notato,
 che (ovviamente) non viene disegnato nulla, ma ilmetodo run continua a ciclare,
 quindi a modificare le coordinate.
 
 Immagino che la soluzione sia che il thread quando calcola le coordinate
 e chiama repaint attende finche la procedura di ridisegnare Jpanel sia finita
 per riprendere a calcolare.
 
 Come posso implementare il tutto?
 Aggiungo che, se dentro al metodo run metto un Thread.sleep(0) dopo la
 chiamata a repanti()  i movimenti
 sono lineare e non a scatti, ma piu immagini metto piu i movimenti complessivi
 sono terribilmenti lenti! (ho provato con um max di 10 imamgini)
 Invece se dentro il metodo run() metto un System.out.println(""); dopo la
 chiamata a repanti() 
 i movimenti sono abbastanza lineari.. 
 immagino che questo sia dovuto al
 fatto che il metodo prima di riprendere a calcolare le coordinate 
 effettuando una operazione di output o attendendo ha dato tempo al paintCOmponet di eseguire
 tutte le operazioni!
 
 come posso gestire il tutto con le proprieta dei thread?
 
 sperando di essere stato chiaro,
 un grazie a chi mi vuole rispondere e dare un suggerimento.
 
 
 

 inserire le varie immagini in un array.... 
tutte le immagine le carico prima, al momento di creare il JPanel con questo codice:
    	Toolkit tk = Toolkit.getDefaultToolkit();
 
    	for (int x=0; x<numImagini; x++) {
    		bersagli[x] = tk.getImage("immagine" + (x+1) + ".gif");
    	}
 
    	MediaTracker mt = new MediaTracker(this);
 
    	for (int x=0; x<numImagini; x++) { mt.addImage(bersagli[x], x+2); }
 
    	try { mt.waitForAll(); } catch (InterruptedException e){}
LovingJava

On 24 Nov 2004 12:27:12 GMT, "LovingJava"
<adelpuvaNO_SPAM@NO_SPAMlibero.it> wrote:

Le immagini le carichi PRIMA di far partire il thread o le carichi a
tempo runtime? devi assicurarti che le immagini siano state del tutto
caricate prima ancora di visualizzarle.... il metodo prepareImage
(nella classe Toolkit) serve appunto a quello.... 
quindi dovresti prima caricare le immagini (tutte) e poi ciclare
all'interno del thread.... la soluzione piu semplice č quella di


  [SNIP]
Come ho già scritto pochi giorni fa (19-11), una soluzione consiste 
nell'usare la classe Timer.
Incollo di seguito le righe.
[Citazione:
Ho fatto qualcosa di molto simile, trovando molto utile la classe Timer 
(
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/Timer.html
), che 
istanzia oggetti capaci di generare ActionEvent ad intervalli di tempo 
prefissati (granularità: ms).
Utile anche la lettura di 
http://java.sun.com/products/jfc/tsc/articles/timer/
fine Citazione]
Se è solo animazione grafica non particolarmente complessa che ti 
occorre, non c'è bisogno di ricorrere ai thread. Basta inserire nel 
metodo actionPerformed(.), relativo al listener registrato sull'istanza 
di Timer, l'aggiornamento delle coordinate e il repaint().
Buon divertimento.
Fabrizio