|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2005
Città: Cosenza
Messaggi: 425
|
[Java - grafica] Eliminare il flickering
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. Codice:
// 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
}
}
Soluzioni brillanti? Grazie
__________________
Ultima modifica di Aines : 18-04-2006 alle 13:01. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2000
Messaggi: 235
|
Per evitare gli effretti di flickering, in genere si usa la tecnioca del double buffering:
http://java.sun.com/docs/books/tutor...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?
__________________
...writing about climbing is boring. I would rather go climbing. (Chuck Pratt) |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2005
Città: Cosenza
Messaggi: 425
|
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 Codice:
// 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);
}
__________________
Ultima modifica di Aines : 19-04-2006 alle 09:15. |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2002
Messaggi: 73
|
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
__________________
Dm - G7 - Cmay7 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:18.



















