Newsgroup: it.comp.java
Titolo: Domanda simpatica (riguarda GRAPHICS)

Salve a tutti...
Ho una domanda interessante (spero). Mi sono imbattuto più volte ormai
nell'implementazione di una tavoletta grafica (usandola come componente di
una chat ad esempio :D).
Il procedimento è il seguente (semplificato, io mi sono rovinato la vita a
modellare tutto in + oggetti): estendo un bel JPanel in modo da passargli
una struttura dati che contiene coppie di punti, ovverio segmenti
(x1,y1,x2,y2). Man mano che TRASCINO il mouse il MouseMotionListener cattura
le coordinate e in continuazione mi acquisisce i dati e stampa i segmenti
del tipo sopraspecificato, una struttura tipo:
    12, 12, 150,180
    150, 180, 151,181
    [.....]
Infine creo un processo di interpolazione e rendo continui i segmenti (lo
potrei fare con drawline, direte voi... e invece no, perchè la linea deve
avere uno spessore variabile, quindi meglio disegnare tanti cerchi a
completare i segmenti).
La domanda è la seguente. Questo processo è davvero funzionalissimo, per i
primi diciamo 10 secondi di acquisizione. Successivamente il jpanel fa
sempre più fatica a printare il disegno, che assume proporzioni sempre +
grandi. Il fatto è che man mano che acquisisco i dati, quando faccio
        repaint();     sul mio JPanel
devo necessariamente ridisegnare TUTTI i segmenti e INTERPOLARLI,
un'operazione follemente dispendiosa a livello computazionale. Ma se non
faccio così repaint() chiama paintComponent() e mi disegna solo gli ultimi
dati, ovviamente (aggiornando il Graphics).
Come posso risolvere il problema? Pensavo ad un modo di "stampa" diciamo
"statica", cioè che non deve essere aggiornata di sana pianta, non so se
riesco a spiegarmi.
Grazie per la pazienza ^^
A presto

 
ciao,
perchè non disegni su un buffer... persistente, così devi solo 
aggiungere i nuovi punti, e mostri poi quello?
Inoltre, potresti solo aggiornare la parte di disegno che viene 
effettivamente modificata: vedi public void repaint(int x, int y, int 
width, int height).
Mauro

Disegnare su un buffer.... mi sai dare qualche dritta in più...? Sembra
interessante :D
"

 
ti crei un oggetto immagine persistente (non definito nel metodo paint):
Image offscreenImage = createImage(dim.width, dim.height);
quindi usi il suo graphics per disegnare *solo* i nuovi punti:
Graphics og = offscreenImage.getGraphics();
alla fine, nel paint, disegni su schermo l'immagine:
g.drawImage(offscreenImage, 0, 0, this);
Mauro

 ha scritto nel messaggio
news:4285eedc$0$20688$5fc...@news.tiscali.it...


 segmenti del tipo sopraspecificato, una struttura tipo:
Una cosa di questo tipo?
-----------------------------------------------------
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class ts implements MouseListener
{
        clsFrame f;
        Polygon pol=new Polygon();
 
        public void mouseEntered(MouseEvent me) {}
        public void mousePressed(MouseEvent me) {}
        public void mouseExited(MouseEvent me) {}
        public void mouseClicked(MouseEvent me) 
        {
                pol.addPoint(me.getX(),me.getY());
                f.repaint();
        }
        public void mouseReleased(MouseEvent me) {}
 
 
        ts()
        {
                f=new clsFrame("test",this.pol);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
                f.setSize(300,300);
                f.addMouseListener(this);
                f.setVisible(true);
        }
 
        public static void main(String[] args)
        {
                new ts();
        }
}
class clsFrame extends JFrame
{
        Polygon pol;
 
        public clsFrame(String testo,Polygon p)
        {
                super(testo);
                this.pol=p;
        }
 
        public void paint(Graphics g)
        {
                for (int cont=0;cont<(pol.npoints-1);cont++)
 
g.drawLine(pol.xpoints[cont],pol.ypoints[cont],pol.xpoints[cont+1],pol.ypoints[cont+1]);
        }
}
-------------------------------------------------------------
Praticamente ho esteso un JFrame e ho passato alla classe estesa una classe
Polygon per l'implementazione dei punti.
L'esempio funziona cliccandosul frame; nel tuo caso, basta implementare
l'evente MouseMotion, invece che MouseClicked.
Ciao,
 Fabrizio
=== 
http://www.negusweb.it
 ===

il procedimento mi è tutto chiaro, ovviamente io ho esteso il panel
piuttosto che il frame
però nn capisco... la seguente linea di codice:
g.drawLine(pol.xpoints[cont],pol.ypoints[cont],pol.xpoints[cont+1],pol.ypoin
ts[cont+1]);
non mi permette di disegnare una linea di spessore maggiuore di 1...ecco
perchè non è complicata :S

 perchè non è complicata :S
Semplicemente perchè non gli hai chiesto di farlo in quel modo.
Dai un'occhiata qui:
http://java.sun.com/docs/books/tutorial/2d/display/strokeandfill.html
-- 


Cosa dire... adesso dopo tutto il tempo che ho perso per creare questo
bell'inerpolatore trovo che la soluzione sta negli strokes..:D:D
Grazie mille, nn conoscevo questa funionalità di JAVA 2d
Alex

Alex =) wrote:

Non è tempo perso ... la prossima volta che la situazione si complicherà
troppo, sicuramente qualche dubbio in più ti verrà ... :-D
