Newsgroup: it.comp.java
Titolo: disegnare su swing

Ho un problema abbastanza impellente e mi sarebbe veramente d'aiuto una
mano. I fatti sono questi: ho un'equazione da graficare in tempo reale su
diversi JPanel;
attraverso un Timer inizializzo l'equazione, richiamo i vari print per le
varie finestre, aggiorno l'equazione con l'aggiunta di un delta, e cosě via.
Il problema č: ad ogni nuova chiamata dei print (ho sovrascritto i metodi
con una chiamata alla superclasse), i JPanel vengono prima cancellati e poi
ridisegnati ottenendo cosě non una forma d'onda che si propaga ad ogni
ciclo, ma un semplice punto che si muove. Come posso risolvere? Grazie mille
per la collaborazione.
p.s.
aggiungo la mia mail per qualsiasi risposta piů esauriente e/o ulteriori
delucidazioni
mala...@libero.SENZAILMAIUSCOLOit

 ha
scritto:

ciao 
Mi chiedo perche usi il timer per la visualizzazione della funzione...
non bastava creare il grafico della funzione tramite la funzione
paint? o semplicemente tramite il semplice richiamo di una singola
volta del metodo print? 
Io non ho mai usato il metodo print... anche perche di solito č
sconsigliato ridefinirlo. (vedi documentazione) Se devi disegnare su
un JPanel meglio che usi il metodo paint...... il problema pero sta
appunto nel richiamo di questo metodo: infatti nella chiamata di paint
viene richiamato anche il metodo update... che di default cancella
tutto il contenuto grafico del JPanel. Quindi se vuoi che i punti
precedenti rimangano disegnati devi riderfinire update in modo che nn
compia alcuna modifica al componente. (infatti update di default
consiste nel disegno di una area rettangolare del colore dello sfondo
che copre tutta l'area del JPanel)
Cmq faccio notare che anche nel caso dell'utilizzo del metodo print il
metodo update viene cmq richiamato.... quindi la soluzione č sempre la
stessa: 
public void update(Graphics g) {
    // non compio alcuna modifica
}
public void paint(Graphics g) {
   // disegno il grafico (o un singolo punto del grafico)
}
Spero di esserti stato di aiuto

 Spero di esserti stato di aiuto
Mi scuso per l'errore ma in effetti ho usato paint e non print. Il problema
è un altro. Come hai giustamente detto anche io avevo fatto in modo che
tutti i valori in un determinato lasso di tempo fossero salvati in una lista
e poi tramite paint disegnati uno ad uno (con una for guidata da un
iterator, ad esempio). Chi mi ha commissionato il lavoro, però, vuole che
una volta lanciato il metodo esso continui fino a quando non ci sia un
intervento esterno a fermarlo (in teoria potrebbe continuare all'infinito).
A questo punto devo obbligatoriamente acquisire in tempo reale i valori e
disegnarli. Ho provato a ridefinire update ma quando invoco paint e la sua
superclasse, questa mi cancella ogni volta tutto. Ho provato a non invocare
la superclasse, ma come dice la documentazione "...probabilmente vedrai
degli artefatti...". Ogni soluzione che provo mi risovle un problema ma me
lo crea un altro. Comunque ti ringrazio.

 ha
scritto:

Non potresti copiare un po di codice? almeno forse riesco a capire
meglio... e a trovare l'errore ^_^ 

Ecco un po' di codice.
public void setSec() {
            attual_vlv = eq.getAttualVlv(); // acquisisce i valori da
graficare
            preced_vlv = eq.getPrecedVlv(); //
            vlvSum += attual_vlv;   // utilizzato per la media
            repaint();
            cicli += 1;
        }
        public void update(Graphics g) {    // riscrivo il metodo paint
            paint(g);
        }
        public void paint(Graphics g) {
            super.paint(g);                        // se tolgo questa
chiamata succede il caos
            /* le linee seguenti sono utilizzate per adattare il disegno
               alle dimensioni variabili di una frame */
            int width = getWidth();
            double wstep = (double)(9*width/10)/(double)XPOINTS;
            int height = getHeight();
            double hstep = -(double)(9*height/10)/(double)YPOINTS;
            /* grafico i primi due valori */
            g.setColor(Color.blue);
            int x1 = (int)(cicli-1 * wstep + width/10);
            int x2 = (int)(cicli * wstep + width/10);
            int y1 = (int)(preced_vlv * hstep + 9*height/10);
            int y2 = (int)(attual_vlv * hstep + 9*height/10);
            System.out.println(cicli + " " + preced_vlv + " " + attual_vlv);
            g.drawLine(x1, y1, x2, y2);
            /* codice per gli assi cartesiani */
            g.setColor(Color.black);
            g.drawLine((int)width/10, (int)height/10, (int)width/10,
(int)9*height/10); //asse y
            g.drawLine((int)width/10, (int)9*height/10, (int)width,
(int)9*height/10); //asse x
            g.drawLine((int)width/10, (int)height/10, (int)width/9,
(int)height/10); //tacca y
            g.drawString("Vlv [mmHg]", 0, (int)height/12);
            g.drawString("200", 0, (int)height/5);
            g.drawString("time [sec]", (int)(width/1.5), (int)height);
            g.drawString(String.valueOf((cicli)*0.002), (int)(width/1.1),
(int)height);
        }
Grazie ancora per il tempo dedicatomi

Ecco un po' di codice.

Da quanto ho capito il tuo grafico viene disegnato a seconda di alcuni
valori generati in tempo reale... presumo che siano valori generati da
un altro processo e indipendenti dall'input utente.... altrimenti nn
avresti strutturato il tuo codice cosi....
Cmq teoricamente senza la chiamata del al paint della superclasse
dovrebbe andare... infatti se chiami il paint della superclasse è
probabile che questa ti cancelli il contenuto del panel.... 
Ma lo spezzone di codice che mi hai dato non è sufficiente per capire
qual è l'errore... dovrei vedere il risultato grafico per darti
suggerimenti in proposito.
Se la cosa nn ti infastidice potresti mandarmi il codice sorgente
completo via email? o almeno la classe completa che si occupa della
visualizzazione del grafico.... 
Fammi sapere.

Ti ho mandato via mail quello che mi avevi richiesto. Grazie


Ti ho risposto alla tua mail e credo di aver risolto il problema...
anche se in un modo poco "ortodosso".
Ciao

Dovresti memorizzarti in un Vector (o altro) tutti i punti acquisiti e nel
metodo paint ridisegnarli tutti.
-- 
Pietro	- 
http://www.pietroweb.tk
Linux Registered User #304991
Powered by MDK Linux Kernel 2.6.3