Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    13

    Visualizzare immagini con ritardo

    Buon giorno a tutti. Eccomi nuovamente a chiedere il vostro aiuto per la risoluzione di un problema.
    Nel mio programma vorrei fare in modo che, quando si schiaccia un bottone, 5 immagini si "stampino" sul JPanel nel quale sono alloggiate con un piccolo ritardo. Inoltre mi piacerebbe che una volta schiacciato il bottone questo meccanismo (stampa con ritardo delle immagini) si ripetesse per tre volte. Ecco che cosa ho pensato di fare io

    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.util.*; 
    
    public class BackgroundPanel extends JPanel
    {
    private Image im1;
    private Image[] d;
    private int n1,n2,n3,n4,n5,height,width;
    private Graphics f;
    private MyThread th;
    
    
    public BackgroundPanel(int n1, int n2, int n3, int n4, int n5)
     {
    	 //aggiungo immagine
    	 Toolkit t= Toolkit.getDefaultToolkit();
    	 im1 = t.getImage("tavolo.jpg");
    	 d = new Image[6];
    	 d[0] = t.getImage("dice1.png");
    	 d[1] = t.getImage("dice2.png");
    	 d[2] = t.getImage("dice3.png");
    	 d[3] = t.getImage("dice4.png");
    	 d[4] = t.getImage("dice5.png");
    	 d[5] = t.getImage("dice6.png");
    	 
    	
    	 MediaTracker m1= new MediaTracker(this);
    	 m1.addImage(im1, 1);
    	 m1.addImage(d[0], 2);
    	 m1.addImage(d[1], 3);
    	 m1.addImage(d[2], 4);
    	 m1.addImage(d[3], 5);
    	 m1.addImage(d[4], 6);
    	 m1.addImage(d[5], 7);
    	 
    	 try
    	 {
    		 m1.waitForAll();
    	 }
    	 catch (InterruptedException e)
    	 {
    	 }
    	 width=756;
    	 height=817;
     }
    
    public void paintComponent (Graphics g)
      {
    	super.paintComponent(g);
    	int x,y;
    	x=120;
    	y=350;
    	g.drawImage(im1, 0, 0,width,height,null);
    	g.drawImage(d[n1], x, y,null);
    	g.drawImage(d[n2], 2*x, y,null);
    	g.drawImage(d[n3], 3*x, y,null);
    	g.drawImage(d[n4], 4*x, y,null);
    	g.drawImage(d[n5], 5*x, y,null);
      }
    
    public Image ReturnIm1()
      {
    	return (im1);
      }
    
    
    public void Repaint()
      {
    	int i;
    	for(i=0; i<3; i++)
    	{
    		th = new MyThread();
    		th.start();
    		try
    		{
    			Thread.sleep(100);
    			n1=(int)(6*Math.random());
    			n2=(int)(6*Math.random());
    			n3=(int)(6*Math.random());
    			n4=(int)(6*Math.random());
    			n5=(int)(6*Math.random());
    			height=this.getHeight();
    			width=this.getWidth();
    			this.repaint();
    		}
    		catch (InterruptedException e)
    		{
    			th.setStop(true);
    		}
    	}
      }
    
    }
    Ecco il codice della classe che estende il Thread:
    codice:
    public class MyThread extends Thread
    {
    	private boolean stop=false;
    	
    	public void run()
    	{
    		for(int i=1; true; i++)
    		{
    			if (stop)  return;
    		}
    	}
    	
    	public void setStop(boolean val)
    	{
    		stop=val;
    	}
    }
    Quando schiaccio il bottone le immagini vengono stampate sul JPanel con un piccolo ritardo ma il procedimento non viene ripetuto 3 volte. O meglio io non riesco a vedere che le immagini vengono ridisegnate per 3 volte.

  2. #2
    Thread.sleep(100);

    un pò pochi 100 millisecondi... non trovi?
    Al mio segnale... scatenate l'inferno!

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    13
    Ho provato a cambiare la temporizzazione...sono arrivato fino ad 1 secondo ma il risultato non cambia.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Visualizzare immagini con ritardo

    Originariamente inviato da cozza.89
    Quando schiaccio il bottone le immagini vengono stampate sul JPanel con un piccolo ritardo ma il procedimento non viene ripetuto 3 volte. O meglio io non riesco a vedere che le immagini vengono ridisegnate per 3 volte.
    Innanzitutto hai creato 3 thread distinti (che sono "concorrenti"). E non è questo che ti servirebbe. Poi comunque lo sleep lo fai in Repaint() e se è stato invocato nel contesto del EDT (es. da un actionPerformed) .... nulla si aggiorna a video perché lo tieni impegnato tu.

    No, dovresti creare 1 solo thread il cui lavoro sia quello di ripetere per 3 volte la sequenza sleep/impostazioni/richiesta-repaint. Con tutto ciò che ne deriva riguardo la thread-safety (repaint() è thread-safe, l'accesso diretto ai vari campi n1, n2..... da un altro thread no).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    13
    Non ho capito bene quello che intendi. Dici che dovrei fare una cosa del genere:

    codice:
    public void Repaint()
      {
    	th = new MyThread();
    	th.start();
    	try
    	{
    		Thread.sleep(100);
    		n1=(int)(6*Math.random());
    		n2=(int)(6*Math.random());
    		n3=(int)(6*Math.random());
    		n4=(int)(6*Math.random());
    		n5=(int)(6*Math.random());
    		this.repaint();
    		
    		Thread.sleep(100);
    		n1=(int)(6*Math.random());
    		n2=(int)(6*Math.random());
    		n3=(int)(6*Math.random());
    		n4=(int)(6*Math.random());
    		n5=(int)(6*Math.random());
    		this.repaint();
    		
    		Thread.sleep(100);
    		n1=(int)(6*Math.random());
    		n2=(int)(6*Math.random());
    		n3=(int)(6*Math.random());
    		n4=(int)(6*Math.random());
    		n5=(int)(6*Math.random());
    		this.repaint();
    		
    		height=this.getHeight();
    		width=this.getWidth();
    		this.Repaint();
    	}
    	catch (InterruptedException e)
    	{
    		th.setStop(true);
    	}
    
      }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cozza.89
    Dici che dovrei fare una cosa del genere
    No affatto. Tutta quella sequenza la stai facendo dentro Repaint(), nel contesto del thread che l'ha invocato (e ripeto che se è il EDT è sbagliato concettualmente). È il run() nel MyThread che deve avere tutta quella sequenza di sleep, impostazioni ecc.... Perché tutta l'intera sequenza deve "girare" separatamente dal EDT.

    E ripeto ancora le questioni legate alla thread-safety: repaint() è thread-safe. n1, n2, .... sono usate sia nel contesto del EDT (lette nel paintComponent) e saranno usate nel tuo thread separato (scritte nel run()). Questo non è "safe" ma più che altro per una questione di "visibilità" che non è garantità. Se vuoi fare le cose bene, almeno dichiara quelle variabili come private volatile int n1,n2,........ Con il volatile la "visibilità" è garantita.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.