PDA

View Full Version : [Java - grafica] Eliminare il flickering


Aines
18-04-2006, 12:56
Si dice flickering? Comunque intendo lo sfarfallio degli oggetti disegnati causato (penso) da continue chiamate al metodo repaint().

Spiego meglio.

L'applicazione disegna dei rettangoli colorati su un pannello (proprio un jPanel).
I rettangoli sono conservati in un array.

L'utente può cliccare su un rettangolo e trascinarlo, il codice è gestito in questo modo.


// Quando il mouse viene premuto sul pannello di disegno,
// cerca il giusto blocco nell'array, usando le coordinate
private void jPanel1MousePressed(java.awt.event.MouseEvent evt)
{
for(int i = 0; i < blockIndex; i++)
{
if(blockList[i].contains(evt.getX(), evt.getY()))
{
movingBlock = blockList[i];
blockSelected = true;
break;
}
}
}

// Quando il mouse si sposta, cambia le coordinate del blocco selezionato
private void jPanel1MouseDragged(java.awt.event.MouseEvent evt)
{
if(blockSelected)
{
movingBlock.setXY(evt.getX(), evt.getY());
this.repaint(); // ridisegna ogni cosa ogni volta che l'evento
// viene sparato
}
}


Mi pare proprio uno di quei problemi legati all'inesperienza....
Soluzioni brillanti? Grazie :D

theClimber
18-04-2006, 20:31
Per evitare gli effretti di flickering, in genere si usa la tecnioca del double buffering:

http://java.sun.com/docs/books/tutorial/extra/fullscreen/doublebuf.html

Se stai usando Swing (il nome jpanel nei metodi e' un indizio?), di default dovrebbe essere attivo sugli oggetti JPanel. Gli oggetti rettangolo come sono disegnati?

Aines
19-04-2006, 08:30
Si, utilizzo swing per il pannello sul quale disegnare, ma i rettangoli sono degli oggetti di tipo Rectangle2D.Double che fa parte di awt (infatti tutti gli altri componenti del frame, i bottoni, le liste, il menù, che sono swing, non traballano)

All'interno di una classe Block, che ha tra le variabili globali un oggetto rectangle di tipo Rectangle2D.Double, si trova il metodo paint


// disegna il bordo, la scritta ed il colore dentro al blocco
public void paint(Graphics2D g)
{
Graphics2D graphics = g;
graphics.setStroke(stroke);
graphics.setPaint(Color.black);
graphics.draw(rectangle);
graphics.setPaint(color);
graphics.fill(rectangle);
graphics.setPaint(Color.black);
graphics.drawString(name, xPos + 10, yPos + 20);
}


Ora mi leggo il double buffering e vedrò di implementarlo. Grazie.

slowguitar
19-04-2006, 15:11
Ciao hai provato a ridefinire il metodo update del JPanel e dargli il da lì il
repaint()?
se non ricordo male io facevo così...ma non sono sicuro :D