Newsgroup: it.comp.java
Titolo: Applet e paint in modo sincrono

Salve a tutti, ho un piccolo problemino con la paint()
di una applet, cioe':
1) ricevo evento su obj1
2) disegno obj1
3) ricevo evento su obj2
4) disegno obj2
5) cancello obj1 e obj2
Il mio probelma e' che, quando ricevo l'evento sull'obj2, al posto
di disegnarlo e poi cancellarlo, a video non si vede nulla.
O meglio sembra che da 3) passo subito a 5) senza passare per il 4).
Da qui capisco che:
paint viene eseguito da un thread asincrono, e che non viene subito "flushata"
la grafica.
Ho provato anche a piazzare un wait(10) tra 4) e 5), ma ricevevo o una 
eccezione oppure non succedeva nulla(in base alle versione del sorcio del
programma che stavo scrivendo) e da 3) passavo ancora a 5).
Come fare?
Qualsiasi idea e' ben accetta =)
Grazie
-- 
Paolo
	4.4 - The number of the Beast	
Visit the Italian FreeBSD User Group site: 
www.gufi.org

Qualsiasi idea e' ben accetta =)
secondo me e' meglio se posti il codice
ciao_<
Andrea
http://digilander.iol.it/schiele

 secondo me e' meglio se posti il codice
Io lo posto pure, ma dubito che lo capiate =)
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
import java.awt.Image;
import java.awt.Event;
public class Memory2 extends java.applet.Applet {
 
	int width=640;
	int height=480;
	int border=50;
	int cwidth=40;
	int cheight=80;
	int intracard=20;
	int score=0;
 
	int precx;
	int precy;
	boolean toControl=false;
 
	Carte mazzo;
 
	public void init()  {
		Image[] temp=new Image[10];
		Image cop;
 
		temp[0]=getImage(getCodeBase(),"images/images0.jpg");
		temp[1]=getImage(getCodeBase(),"images/images1.jpg");
		temp[2]=getImage(getCodeBase(),"images/images2.jpg");
		temp[3]=getImage(getCodeBase(),"images/images3.jpg");
		temp[4]=getImage(getCodeBase(),"images/images4.jpg");
		temp[5]=getImage(getCodeBase(),"images/images5.jpg");
		temp[6]=getImage(getCodeBase(),"images/images6.jpg");
		temp[7]=getImage(getCodeBase(),"images/images7.jpg");
		temp[8]=getImage(getCodeBase(),"images/images8.jpg");
		temp[9]=getImage(getCodeBase(),"images/images9.jpg");
 
		cop=getImage(getCodeBase(),"images/imagecop.jpg");
 
		mazzo = new Carte(temp,cop);
		mazzo.mostra();
		mazzo.mischia();
		mazzo.mostra();
	}
 
	public boolean mouseDown(Event evt, int x, int y) {
 
		int arrayx=(x-border);
		int arrayy=(y-border);
 
		if ((arrayx>0)&&(arrayx<cwidth)) arrayx=0;
		else if ((arrayx>(cwidth+intracard)) && (arrayx<(2*cwidth+intracard))) arrayx=1;
		else if ((arrayx>(2*cwidth+2*intracard)) && (arrayx<(3*cwidth+2*intracard))) arrayx=2;
		else if ((arrayx>(3*cwidth+3*intracard)) && (arrayx<(4*cwidth+3*intracard))) arrayx=3;
		else if ((arrayx>(4*cwidth+4*intracard)) && (arrayx<(5*cwidth+4*intracard))) arrayx=4;
		else return true;
 
		if ((arrayy>0)&&(arrayy<cheight)) arrayy=0;
		else if ((arrayy>(cheight+intracard)) && (arrayy<(2*cheight+intracard))) arrayy=1;
		else if ((arrayy>(2*cheight+2*intracard)) && (arrayy<(3*cheight+2*intracard))) arrayy=2;
		else if ((arrayy>(3*cheight+3*intracard)) && (arrayy<(4*cheight+3*intracard))) arrayy=3;
		else return true;
 
		if (mazzo.isPresent(arrayx,arrayy))  {
			mazzo.flipCard(arrayx,arrayy);
 
			repaint();
			/*try {
				wait(10);
			} catch (InterruptedException e) {}*/			
			controlCard(arrayx, arrayy);
		}	
		return true;
	}
 
 
	public void start() {
 
	}
 
 
	public void paint(Graphics screen) {
		if (score==10)  {
			screen.drawString("HAI VINTO!!!! LUGAAAAAAAAAAAAAAAAAAAAAAAA....",70,150);
		}
		drawAllCards(screen);
	}
 
 
	/***********************************************************************************/
	/***********************************************************************************/
	/*********************************PRIVATE CODE HERE*********************************/
	/***********************************************************************************/
	/***********************************************************************************/
 
	private void drawAllCards(Graphics screen)  {
		for (int i=0;i<4;i++)  {
			for (int j=0;j<5;j++)  {
				if (mazzo.isPresent(j,i))  {
					screen.drawImage(mazzo.getCardImage(j,i),(border+j*(cwidth+intracard)),(border+i*(cheight+intracard)),this);
				}
			}
		}
	}
 
	private void controlCard(int x, int y)  {
 
		if (toControl)  {
			if ((mazzo.getColor(precx,precy)==mazzo.getColor(x,y))&&((x!=precx)||(y!=precy)))  {
				mazzo.removeCard(precx, precy); mazzo.removeCard(x,y); toControl=false; score++; repaint(); 
			} else  {
				mazzo.flipCard(precx, precy); mazzo.flipCard(x, y); toControl=false; repaint();
			}
		} else  {
			toControl=true; precx=x; precy=y;
		}
		//if (score==10) theEnd();
	}
 
	private void theEnd()  {
		System.out.println("YOU WIN!!!!!!!!!!!!!!!!!!!!");
	}
 
}
Se decommento la try{} catch di sopra, ricevo una bella eccezione..=P
Why?
E poi c'e' la classe Carte:
import java.awt.Image;
class Carte  {
	Image[] images=new Image[10];
	Image imagecop;
 
	int[][] carte;
 
	int[][] state;
/*
Doc about the state:
0 mean card cover
1 mean card with image
2 mean position void
*/
 
	Carte(Image[] temp, Image cop)  {
		carte = new int[4][5];
 
		state = new int[4][5];
 
		images[0]=temp[0];
		images[1]=temp[1];
		images[2]=temp[2];
		images[3]=temp[3];
		images[4]=temp[4];
		images[5]=temp[5];
		images[6]=temp[6];
		images[7]=temp[7];
		images[8]=temp[8];
		images[9]=temp[9];
 
		imagecop=cop;	
	}
 
	public void mostra()  {
		for (int i=0; i<4; i++)  {
			for (int l=0; l<5; l++)  {
				System.out.println("riga:" +i+" colonna: "+l+" valore: "+carte[i][l]);
			}
		}
	}
 
	public void mischia()  {
		// I need a real random number generator
 
		for (int i=0; i<2; i++)  {
			for (int l=0; l<5; l++)  {
				carte[i][l] = l+(i*5);
			}
		}
 
 
		for (int i=2; i<4; i++)  {
			for (int l=0; l<5; l++)  {
				carte[i][l] = l+((i-2)*5);
			}
		}
 
		for (int i=0; i<4; i++)  {
			for (int l=0; l<5; l++)  {
				state[i][l] = 0;		// all cards are present, but are covered
			}
		}	
 
 
 
	}
 
	public boolean isPresent(int x, int y)  {
		if (state[y][x]!=2) { return true; } 
		else  { return false; }
	}
 
	public Image getCardImage(int x, int y)  {
		if (state[y][x]==0)  { return imagecop; }
		else { return images[carte[y][x]]; }
	}
 
	public void flipCard(int x,int y)  {
		if (state[y][x]==0) state[y][x]=1;
		else state[y][x]=0;
	}
 
	public int getColor(int x, int y)  {
		return carte[y][x];	
	}
 
	public void removeCard(int x, int y)  {
		state[y][x]=2;
	}
 
 
}
Se qlc capiscie come fare un paint() "sincrono" mi fa un grosso favore...=P
Grazie.


Visit the Italian FreeBSD User Group site: 
www.gufi.org
ehm...
ti ho chiesto il codice ma di fatto nel codice 
che hai postato non vedo obj1 e obj2...
intendo dire che non vedo la sequenza
cosi' come l'hai descritta...
hai provato a stampare con System.out.println()
qualche frase di debug quando entri in paint()?
potresti verificare se effettivamente la paint
viene chiamata come ti aspetti 
l'eccezione che ricevi ha un nome?
puoi usare anche repaint(long tm)
dove tm e' il massimo tempo di attesa in 
millisecondi prima che venga eseguita update
forse si puo' impostare tm a zero...
ciao_O
Andrea
http://digilander.iol.it/schiele

 forse si puo' impostare tm a zero...
gia' provata, sembra non funziare...=P
cmq sia grazie...spero domani di mandare lo snippet...=P



allora significa che usi wait senza essere 
dentro ad un blocco synchronized
o ad una funzione synchronized
devi usare Thread.sleep(x)
ciao_O
Andrea
http://digilander.iol.it/schiele

 devi usare Thread.sleep(x)
ehhhmmmm...=)
me ne ero proprio dimenticato..=)
cmq sia non cambia nulla, cioe' l'applet non disegna nulla...cmq
aspetta domani, e forse riesco a farti vedere quel pezzettino di codice...=)
Cmq sia grazie...
