Newsgroup: it.comp.java
Titolo: [AWT]Canvas.paint() e flickering

Dentro al metodo paint(Graphics g) di una mia classe che estende Canvas
faccio un po di drawString(...) sul Graphics di una Image offscreen e poi
faccio g.drawImage(offscreen,0,0,this);
Tant'è il Canvas diventa bianco (o meglio, del colore di background...) per
un percettibile istante prima di disegnare l'immagine, tanto che se ho più
di un paint al secondo fatico a vedere le scritte (sia nell'appletviewer SUN
che nel browser IE).
Sto sbagliando qualcosa od è un fastidioso comportamento normale?
(Il colpevole NON è il g.clearRect(0,0,width,height) dell'update(Graphics g)
ereditato da Component... ho sovrascritto pure quello...)
TIA,
Maurizio.
P.s.: dove trovo una documentazione esaustiva sul thread AWT per capire con
precisione quali metodi e quando vengono chiamati nel ridisegno
dell'interfaccia?
P.p.s.: non vedo l'ora che IE abbandoni definitivamente la VM di
microsoft...
altro che morte di Java, sarà la mia resurrezione...



ridefinisci update
public void update(Graphics g)
{
	paint(g);
}
ciao_O
_______________________________________
http://jame.sourceforge.net
 
[ last release jame4.2e ]
_______________________________________
http://digilander.iol.it/schiele

 ridefinisci update
Grazie comunque per avermi risposto, ma ahimè come dicevo ho già
sovrascritto update().
Altre idee?
Maurizio.



scusa, mi e' sfuggito


 wrote:

scusa una domanda, ma quanto e' grande l'applet?
un po' di sfarfallio ci sara' sempre dato che non esiste 
una vera sincronizzazione con il pennello elettronico
(evidente se ad esempio alterni velocemente due colori 
diversi o se le dimensioni dell'area dell'applet sono eccessive) 
puo' anche darsi che invochi repaint con una frequenza troppo 
elevata e le repaint si accumulano, in tal caso devi attendere la 
fine della precedente repaint prima di far partire la successiva
ciao_O


nel metodo paint usa:
public void paint  (Graphics g) {
    super.paint(offg);
    ....
}
Forse funziona!

 elevata...
Il canvas viene aggiornato in modo asincrono sulla base di stringhe di 20 o
30 caratteri che arrivano da un server con una frequenza massima che posso
stimare in 2 o 3 stringhe al secondo. Quello che temo maggiormente è un
eventuale "lag" nel metodo drawImage().
Mi piacerebbe capire cosa succede davvero, non solo per sistemare questa
Applet, ma anche per imparare più a fondo.
Danke schoen,
Maurizio.

Maurizio.
senza poter provare il tuo codice non posso aiutarti
se ti puo' essere utile posso passarti un po' di codice che ho scritto
si tratta di una collezione di effetti (fuoco, acqua, fade e crossfade)
e di routine di "basso livello" che sto scrivendo  (in alcuni casi ho 
disassemblato, scopiazzato e poi riscritto il codice di alcune applet 
che ho trovato in rete)
per realizzare questi effetti ho dovuto risolvere problemi di flickering 
quindi dando un'occhiata al mio codice magari trovi qualcosa che
ti puo' servire per risolvere i tuoi problemi
il pacchetto e' di circa 100kb  (con dentro alcune immagini)
altrimenti posta il tuo codice


 senza poter provare il tuo codice non posso aiutarti
Ho provato a postare i sorgenti come allegato ma pare che il server li
rifiuti... (NON sono file BINARI...); inserirli nel body è un avventura...
In alternativa ho approntato una paginetta di test con i sorgenti
scaricabili:
http://loryt.iwarp.com/TestAnsiAreaApplet.html
TIA,
MAurizio.


http://loryt.iwarp.com/TestAnsiAreaApplet.html
La soluzione migliore :-)
-- 
Ciao
	Fabrizio C.



ok, ho risolto 
riscrivi questi metodi nella classe AnsiArea
[...]
	public void setText(String t)
	{
		text=t;
		disegna();
		parent.toBottom();
	}
 
	public void append(String t)
	{
		setText(text+t);
	}
	public void update(Graphics g)
	{
		paint(g);
	}
 
	public void paint(Graphics g)
	{
		if (offImg != null)
		{
			g.drawImage(offImg,0,0,this);
		}
	}
	public void disegna()
	{
		width=getSize().width;
		height=getSize().height;
		offImg=createImage(width,height);
		if (offImg != null)
		{
			tmpGraph=offImg.getGraphics();
			viewHeight=paintText(tmpGraph,width,true);
			if (viewHeight > (height - fontHeight))
			{
				setSize(width,viewHeight + fontHeight);
				parent.validate();
			}
		}
		repaint();
	}
[...]	
il flickering adesso e' sparito quasi del tutto
ma tuttavia non e' completamente eliminabile 
perche' dipende da quella chiamata a validate
(anche se e' meno visibile di prima)
se vuoi eliminare del tutto il flickering devi
eliminare la chiamata a validate e quindi
scrivere un algoritmo di scrolling delle righe
un'altra osservazione riguarda il fatto che e' meglio avere 
un metodo paint corto e spostare tutta l'elaborazione dell'immagine 
in un apposito metodo che ho chiamato disegna (ricorda che il metodo 
paint viene eseguito da un thread grafico creato dalla jvm, mentre il 
metodo disegna viene eseguito da un tuo thread) 


 ok, ho risolto
Corro a provare, grazie 1024M=1G.
Ciao,
Maurizio.

 Corro a provare...
Funziona piu' che accettabilmente.
Il grazie di prima sarebbe stato ugualmente valido indipendentemente da
questo, ad ogni modo lo confermo...
Ciao,
maurizio.