# Actualizar grafico en Java.



## micropepe (Abr 10, 2011)

Necesito mostrar un grafico xy en java, y actualizarlo cada 1 segundo. Hasta ahora se representar ese grafico, pero no se como hacer para actualizarlo.

¿Alguna idea?

Saludos.


----------



## Dr. Zoidberg (Abr 10, 2011)

Con los datos que has dado para la pregunta no vamos a ninguna parte :enfadado: :enfadado:, al menos hubieras pegado el fragmento de código de la clase que has hecho para ver que pretendés lograr.
De todas formas el asunto es fácil. Si tenés que actualizarlo vas a necesitar pintar el canvas (has usado un canvas, no? o un panel????) con el color de fondo (que equivale a borrarlo) y redibujar encima el nuevo conjunto de puntos del gráfico XY. Si ves un parpadeo molesto, vas a tener que implementar un doble-buffer, pintar fuera de la pantalla (en memoria) y luego pegar el dibujo directamente al objeto gráfico.


----------



## micropepe (Abr 11, 2011)

Gracias por contestar, perdonad que no pusiese el codigo, lo tengo dentro de un programa bastante extenso, pero bueno, he extraido la parte importante:


```
import org.jfree.data.xy.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import java.awt.image.*;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import java.io.File;
import org.jfree.chart.plot.*;
import java.io.*;
import java.applet.Applet;
import java.awt.*;

import javax.swing.JFrame;

import org.jfree.data.category.DefaultCategoryDataset;

public class GraficoSimpleLin extends JFrame
{
	public static  long Vfre[]= new long[18];
	public static  int i=0,j=0;
    BufferedImage grafica = null;

    //constructor
    public GraficoSimpleLin() 
    {
       super("Aprendiendo a Graficar con Robert");
    }

    public static BufferedImage creaImagen()
    {
        //XYSeries es una clase que viene con el paquete JFreeChart
        //funciona como un arreglo con un poco mas de posibilidades
       
        XYSeries series = new XYSeries("titulo de la serie");
        //como su nombre lo indica el primer valor sera asignado al eje X
        //y el segundo al eje Y
        for(int cont=0;cont<33;cont++){
        	series.add(i, j);
        	i++;
        	j++;
        }
        //se crea un objeto XYDataset requerido mas adelante por el metodo que grafica
        XYDataset juegoDatos= new XYSeriesCollection(series);
       
          
        JFreeChart chart = ChartFactory.createXYLineChart        ("Titulo del grafico",
        "Eje X","Eje Y",juegoDatos,PlotOrientation.VERTICAL,
        false,
        false,
        true                // Show legend
        );

        //donde guardaremos la imagen?? pues en un bufer jeje
        BufferedImage image = chart.createBufferedImage(400,400);
       
        return image;
    }

    //public void repaint(java.awt.Graphics g)
    public void paint(java.awt.Graphics g) //-----------------------------------------------------------------------------
    {
        super.paint(g);

        if(grafica == null)
        {
            grafica = this.creaImagen();
        }
        g.drawImage(grafica,30,30,this);
        //g.drawImage(grafica,30,30,null);
        
    }
    
    public static void main(String args[]) 
    {
    	
    	GraficoSimpleLin miventana = new GraficoSimpleLin();
    	miventana.setSize(450,450);
        miventana.show();
        while(true){
        	miventana = new GraficoSimpleLin();
        	miventana.setSize(450,450);
        	miventana.show();
        	i++;
        	j++;
        	try 
			  {
					Thread.sleep(1500);
			  }
			  catch (InterruptedException e) 
			  {
					  
			  }
        }
        
    }

}
```

Estoy usando un panel.

Saludos.


----------



## Dr. Zoidberg (Abr 11, 2011)

Y por que no invocás a *miventana.repaint()* cada vez que querés redibujar la imagen?


----------



## micropepe (Abr 11, 2011)

ezavalla dijo:


> Y por que no invocás a *miventana.repaint()* cada vez que querés redibujar la imagen?



OK, con eso consigo repintar el grafico, el codigo queda así:


```
import org.jfree.data.xy.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import java.awt.image.*;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import java.io.File;
import org.jfree.chart.plot.*;
import java.io.*;
import java.applet.Applet;
import java.awt.*;

import javax.swing.JFrame;

import org.jfree.data.category.DefaultCategoryDataset;

public class GraficoSimpleLin extends JFrame
{
	public static  long Vfre[]= new long[18];
	public static  int i=0,j=0;
	public static  BufferedImage grafica = null;

    //constructor
    public GraficoSimpleLin() 
    {
       super("Aprendiendo a Graficar con Robert");
    }

    public static BufferedImage creaImagen()
    {
        //XYSeries es una clase que viene con el paquete JFreeChart
        //funciona como un arreglo con un poco mas de posibilidades
       
        XYSeries series = new XYSeries("titulo de la serie");
        //como su nombre lo indica el primer valor sera asignado al eje X
        //y el segundo al eje Y
        for(int cont=0;cont<33;cont++){
        	series.add(i, j);
        	i++;
        	j++;
        }
        //se crea un objeto XYDataset requerido mas adelante por el metodo que grafica
        XYDataset juegoDatos= new XYSeriesCollection(series);
       
          
        JFreeChart chart = ChartFactory.createXYLineChart        ("Titulo del grafico",
        "Eje X","Eje Y",juegoDatos,PlotOrientation.VERTICAL,
        false,
        false,
        true                // Show legend
        );

        //donde guardaremos la imagen?? pues en un bufer jeje
        BufferedImage image = chart.createBufferedImage(400,400);
       
        return image;
    }

    //public void repaint(java.awt.Graphics g)
    public void paint(java.awt.Graphics g) //-----------------------------------------------------------------------------
    {
        super.paint(g);

        if(grafica == null)
        {
            grafica = this.creaImagen();
        }
        g.drawImage(grafica,30,30,this);
        //g.drawImage(grafica,30,30,null);
        
    }
    
    public static void main(String args[]) 
    {
    	
    	GraficoSimpleLin miventana = new GraficoSimpleLin();
    	miventana.setSize(450,450);
        miventana.show();
        while(true){
        	grafica = creaImagen();
        	miventana.repaint();
        	i++;
        	j++;
        	try 
			{
					Thread.sleep(1500);
			}
			catch (InterruptedException e) 
			{
					  
			}
        }
        
    }

}
```

Y ahora, como quito ese pequeño parpadeo al refrescar el grafico?

Gracias por todo, saludos.


----------



## Dr. Zoidberg (Abr 11, 2011)

Por que invocás al método *creaImagen *tanto en el lazo del main como en el método *paint()* ????


----------



## micropepe (Abr 11, 2011)

ezavalla dijo:


> Por que invocás al método *creaImagen *tanto en el lazo del main como en el método *paint()* ????



Tienes razón, no hace falta y ademas es el motivo del parpadeo 

Gracias por todo, no controlo mucho de Java, lo poco que sé lo estoy aprendiendo yo solo mirando ejemplos.

El codigo queda así:


```
import org.jfree.data.xy.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import java.awt.image.*;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import java.io.File;
import org.jfree.chart.plot.*;
import java.io.*;
import java.applet.Applet;
import java.awt.*;

import javax.swing.JFrame;

import org.jfree.data.category.DefaultCategoryDataset;

public class GraficoSimpleLin extends JFrame
{
	public static  long Vfre[]= new long[18];
	public static  int i=0,j=0;
	public static  BufferedImage grafica = null;

    //constructor
    public GraficoSimpleLin() 
    {
       super("Aprendiendo a Graficar con Robert");
    }

    public static BufferedImage creaImagen()
    {
        //XYSeries es una clase que viene con el paquete JFreeChart
        //funciona como un arreglo con un poco mas de posibilidades
       
        XYSeries series = new XYSeries("titulo de la serie");
        //como su nombre lo indica el primer valor sera asignado al eje X
        //y el segundo al eje Y
        for(int cont=0;cont<33;cont++){
        	series.add(i, j);
        	i++;
        	j++;
        }
        //se crea un objeto XYDataset requerido mas adelante por el metodo que grafica
        XYDataset juegoDatos= new XYSeriesCollection(series);
       
          
        JFreeChart chart = ChartFactory.createXYLineChart        ("Titulo del grafico",
        "Eje X","Eje Y",juegoDatos,PlotOrientation.VERTICAL,
        false,
        false,
        true                // Show legend
        );

        //donde guardaremos la imagen?? pues en un bufer jeje
        BufferedImage image = chart.createBufferedImage(400,400);
       
        return image;
    }

    public void paint(java.awt.Graphics g) //-----------------------------------------------------------------------------
    {
        g.drawImage(grafica,30,30,this);
        //g.drawImage(grafica,30,30,null);
        
    }
    
    public static void main(String args[]) 
    {
    	
    	GraficoSimpleLin miventana = new GraficoSimpleLin();
    	miventana.setSize(450,450);
        miventana.show();
        while(true){
        	grafica = creaImagen();
        	miventana.repaint();
        	i++;
        	j++;
        	try 
			{
					Thread.sleep(1500);
			}
			catch (InterruptedException e) 
			{
					  
			}
        }
        
    }

}
```


----------



## Dr. Zoidberg (Abr 11, 2011)

Bueno...así está bastante mejor. Tenés algunos errores en la arquitectura del programa, pero seguí estudiando y practicando, que es la unica forma de aprender.
Bajá de *acá *y leé el Java Tutorial, es una buena herramienta para comenzar. Luego podés buscar en la red el libro "Thinking in JAVA" y leerlo completo...te va a revelar muchas cosas. Hay mucha literatura adicional de muy buen nivel, pero si sabés poco, mejor comenzá con eso...


----------



## micropepe (May 2, 2011)

Bueno, siguiendo con el mismo ejemplo, necesito actualizar los datos de uno en uno, es decir, segun se reciben los datos irlos mostrando. Llega el dato 1, muestro el dato 1, llega el 2, y muestro el 2 sin borrar el 1... y así sucesivamente.

Pero no he encontrado ningun ejemplo, ni manera de como hacerlo.

Saludos.


----------



## Julianpic (Mar 26, 2013)

micropepe dijo:


> Necesito mostrar un grafico xy en java, y actualizarlo cada 1 segundo. Hasta ahora se representar ese grafico, pero no se como hacer para actualizarlo.
> 
> ¿Alguna idea?
> 
> Saludos.



Veo que ya resolviste tu problema. ¿Me podrían ayudar con el mio?, yo t*a*mb*ién* necesito actualizar el gráfico, 
pero lo he hecho con repaint(); y el parpadeo es horrible, he buscado mucho por ahí pero no lo consigo.
Tengo un hilo que se actualiza cada 10mseg y es el que recibe los nuevos datos.


----------

