Programación en castellano
Inicio > Artículos > Lenguajes orientados a objeto > J2SE > Gráficas en Java con JFreeChart
-Artículos

Gráficas en Java con JFreeChart

1 . Introducción
2 . Gráfico en una ventana
3 . Gráficos mediante Servlet
4 . Obtención de datos de BBDD

Este articulo es cortesia de la Web Adictos Al trabajo.

Introducción

Una aplicación sin gráficas es muy sosa... y normalmente nuestros clientes lo agradecen.

Hay muchas librerías de pago y gratuitas para realizar esta labor. Vamos a mostraros como crear una gráfica simple con una de las librerías más extendidas.

Hemos elegido en este caso JFreeChart y os vamos a mostrar distintas posibilidades de uso.

Descomprimimos los datos en el directorio deseado

Podemos ejecutar una demostración y ver las posibilidades ....

java -jar jfreechart-0.9.10-demo.jar

Si pinchamos uno de los dibujos ..podemos ver las capacidades ....

Gráfico en una ventana

Nosotros vamos a tratar de realizar un ejemplo simple ...y la unica dificultad que he encontrado es la poca documentación disponible (jeje, que se puede comprar )

Aparte de descargarnos JFreeChart, hay que descargarse otra librería llamada jcommun

En NetBean incluimos los dos jars ....

E introducimos el código .. como vemos es reducido... en negrita el particular para pintar la gráfica

ventanaGrafica.java
/*
 * ventanaGrafica.java
 *
 * Created on 9 de agosto de 2003, 9:11
 */
import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import java.awt.image.*;

/**
 *
 * @author  Roberto Canales
 */
public class ventanaGrafica extends java.awt.Frame {
    
  BufferedImage grafica = null;
    
  /** Creates new form ventanaGrafica */
  public ventanaGrafica() {
    initComponents();
  }
    
  /** This method is called from within the constructor to
  * initialize the form.
  * WARNING: Do NOT modify this code. The content of this method is
  * always regenerated by the Form Editor.
  */
  private void initComponents() {
        
    addWindowListener(new java.awt.event.WindowAdapter() {
       public void windowClosing(java.awt.event.WindowEvent evt) {
            exitForm(evt);
       }
    });
        
    pack();
  }
    
  /** Exit the Application */
  private void exitForm(java.awt.event.WindowEvent evt) {
    System.exit(0);
  }
    
  /**
  * @param args the command line arguments
  */
  public static void main(String args[]) {
        
    ventanaGrafica miventana = new ventanaGrafica();
    miventana.setSize(400,400);
    miventana.show();
  }
  
  public BufferedImage creaImagen()
  {
    XYSeries series = new XYSeries("Evolucion");
    series.add(1, 23);
    series.add(2, 34);
    series.add(3, 51);
    series.add(4, 67);
    series.add(5, 89);
    series.add(6, 121);
    series.add(7, 137);
    XYDataset juegoDatos= new XYSeriesCollection(series);
        
    JFreeChart chart = 
     ChartFactory.createLineXYChart("Sesiones en Adictos al Trabajo",  
        "Meses","Sesiones",juegoDatos,PlotOrientation.VERTICAL,
        false,
        false, 
        true                // Show legend
        );
            
    BufferedImage image = chart.createBufferedImage(300,300);   
     return image;
 }
 
 public void paint(java.awt.Graphics g) {
   //super.paint(g);
   
   if(grafica == null)
   {
     grafica = this.creaImagen();
   }
g.drawImage(grafica,30,30,null);
 }
       
}

El resultado de nuestro ejemplo es:

Gráficos mediante Servlet

Otra posibilidad... con este ejemplo tan simple ... podría ser crear un servlet .... que retorne la imagen ....

El mejor modo para seguir avanzando es .. o comprar la documentación .... o hacer introspección de los ejemplos que trae ....

Si queremos generar las gráficas desde un Servlet... es igual de sencillo ... aunque no debemos olvidar incluir en los ficheros .jar de JFreeChart

ejemploGraficasServlet.java
/*
 * ejemploGraficasServlet.java
 *
 * Created on 10 de agosto de 2003, 14:25
 */

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;

/**
 *
 * @author  Roberto Canales
 * @version
 */
public class ejemploGraficasServlet extends HttpServlet 
{

 public JFreeChart crearChart()
 {
   XYSeries series = new XYSeries("Evolucion Sesiones");
   series.add(1, 23);
   series.add(2, 34);
   series.add(3, 51);
   series.add(4, 67);
   series.add(5, 89);
   series.add(6, 121);
   series.add(7, 137);
   XYDataset juegoDatos= new XYSeriesCollection(series);
        
   JFreeChart chart = 
    ChartFactory.createLineXYChart("Sesiones en Adictos al Trabajo",  
     "Meses", "Sesiones", juegoDatos,         
     PlotOrientation.VERTICAL,
     true,true,true);
             
   return chart;
 }
 
    
 int getParamEntero(HttpServletRequest request,String pNombre, int pDefecto)
 {
   String param = request.getParameter(pNombre);
            
   if (param == null || param.compareTo("") == 0)
   {
     return pDefecto;
   }
            
   return Integer.parseInt(param);
                
 }
    
    
 /** Processes requests for both HTTP GET and POST methods.
 * @param request servlet request
 * @param response servlet response
 */
 
 protected void processRequest(HttpServletRequest request, 
   HttpServletResponse response)throws ServletException, IOException {
  response.setContentType("image/jpeg");
        
  OutputStream salida = response.getOutputStream();
  JFreeChart grafica = crearChart();
        
  int ancho = getParamEntero(request,"ancho",400);
  int alto = getParamEntero(request,"alto",300);
        
  ChartUtilities.writeChartAsJPEG(salida,grafica,ancho,alto);
     
  salida.close();
 }
 
 /** Handles the HTTP GET method.
 * @param request servlet request
 * @param response servlet response
 */
 protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
 }
    
}

Vemos el resultado ...

Y podemos cambiar los parámetro y vemos lo rápido que se generan nuestras gráficas

Obtención de datos de BBDD

Normalmente, los datos querremos cogerlos de algun sitio externo, como una base de datos .....

Vamos a crear una tabla en MySQL ... podeis ver como se puede hacer en otros tutoriales asociados.

Creamos en la base de datos test la tabla sesiones con los campos id, x e y

Modificamos un poco el código (no se os olvide incluir en el classpath el driver de jdbc para mysql)

ejemploGraficasServlet.java Modificado
/*
 * ejemploGraficasServlet.java
 *
 * Created on 10 de agosto de 2003, 14:25
 */

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;

import java.sql.*;

/**
 *
 * @author  Roberto Canales
 * @version
 */
public class ejemploGraficasServlet extends HttpServlet 
{

 public JFreeChart crearChart()
 {
   // este código no es optimo ..... hay que usar pools
   
   try 
    {
     String classDriver="com.mysql.jdbc.Driver";
     Driver d = (Driver)Class.forName(classDriver).newInstance();
    }
    catch (Exception e) 
    {
      System.out.println(e);
    }
        
    // GET CONNECTION
    Connection con = null;
        
    try 
    {
      String urlBD="jdbc:mysql://localhost/test";
      con = DriverManager.getConnection(urlBD,"","");
    }
    catch(Exception e) 
    {
      System.out.println(e);
    }

   JDBCXYDataset xyDataset = new JDBCXYDataset(con,
            "select x as meses,y as sesiones from sesiones");
   
   JFreeChart chart = 
    ChartFactory.createLineXYChart("Sesiones en Adictos al Trabajo",  
        "Meses",           
        "Sesiones",        
        xyDataset,         
        PlotOrientation.VERTICAL,
        true,
        true, 
        true                // Show legend
        );
        
   try 
   {
     con.close();
   }
   catch(Exception e) 
   {
     System.out.println("Error al desconectar " + e);
   }
   return chart;
 }
    
    
 int getParamEntero(HttpServletRequest request,String pNombre, int pDefecto)
 {
   String param = request.getParameter(pNombre);
            
   if (param == null || param.compareTo("") == 0)
   {
      return pDefecto;
   }
            
   return Integer.parseInt(param);
 }               
     
    
 /** Processes requests for both HTTP GET and POST methods.
 * @param request servlet request
 * @param response servlet response
 */
 protected void processRequest(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {
   
   response.setContentType("image/jpeg");
        
   OutputStream salida = response.getOutputStream();
   JFreeChart grafica = crearChart();
        
   int ancho = getParamEntero(request,"ancho",400);
   int alto = getParamEntero(request,"alto",300);
        
   ChartUtilities.writeChartAsJPEG(salida,grafica,ancho,alto);
     
   salida.close();
 }
    
 /** Handles the HTTP GET method.
 * @param request servlet request
 * @param response servlet response
 */
 protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
 }
    
}

Y vemos como todo nos funciona bien ..

Ahora ... todo es cuestion de estudiarse la ayuda (o comprar la documentación) e ir adaptando el ejemplo a nuestras necesidades ....

 

Últimos comentarios
Últimos 5 comentarios

Librerias de JFreeChart (07/09/2008)

Por
HOola ke tal soy novato en esto necesito realizar una simulacion del estado de memoria del sistema operativo graficar los porcentajes de cada proceso, eh descargado el JFreeChart y realice el ejemplo anterior pero a un asi me marca errores al compilarlo necesito saber en lugar del J2SDK coloco las librerias o estoy importando mal
ya que me dice esto lpackage org.jfree.data does not exist

Espero contar con tu respuesta graxias......

gráficos java (07/07/2008)

Por
Hola,
Es complicado la explotación de una BBDD en gráficas en java?
Se utiliza JFreeChart? Es gratis? etc etc

Gracias

se puede usar para hacer una transformada rapida de fourier? (01/07/2008)

Por
me gustaria saber si con jfreechart es posible hacer la transformada rapida de fourier a unos datos que estan guardados en mysql, y graficarla claro esta...
eso gracias

dudas (03/06/2008)

Por
Estoy trabajando con el MultiplePieChart y me gustaría saber como puedo cambiar los colores de cada pie y también como cambiar el color y el tipo de letra de cada nombre de los pie, es decir lo que se pasa por parámetro al CategoryDataset (estoy usando el DefaultCategoryDataset) como columnKey cuando se agrega el valor (addValue). Espero que se haya entendido.
Desde ya muchas gracias a quién pueda ayudarme en esto.
Saludos.

Etiquetas de los graficos con angulo (27/02/2008)

Por
Queria pedir ayuda, ya que necesito dar a las etiquetas de las legendas de un grafico generado con el jfreechart 1.0.8 una horientacion vertical o bien darle algun angulo para que se puedan leer cuando existe mucha informacion.
 
Tienda
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad
Mantenida por: Claudio y Dani.

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | amor | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | gratis | posicionamiento en buscadores | decoración libre | gifs animados