Seraphinux
“Lloramos por el lamento de un pájaro pero no por la sangre de un pez, benditos aquellos que tienen voz.”

Java: Crea Graficas Facilmente con JFreeChart

Friday, October 10th, 2008

Saludos a todos, en este post mostrare con crear gráficas de manera fácil y sencilla en una aplicación Swing (java), para esto usaremos una librería llamada JFreeChart.

JFreeChart

Una imagen dice mas que mil palabra y eso es cierto, muchas veces tenemos datos en bruto que no muestran “consistencia” hasta que no los vemos representados en una gráfica. Pues bien, en mi caso usare mi querido Netbeans; asi que lo primero que haremos sera descargar la librería JFreeChart además de la librería JCommons la cual es necesaria para el correcto uso de JFreeChart [Los enlaces estan al final del post].

Una vez que las hemos descargado, vamos a crear un proyecto Java > Java Application, revisamos que la opción “Create Main Class” este desactivada, activamos las opción “Use Dedicated Folder for Storing Libraries” y como parámetro ponemos “.\lib”, la opción “Set as Main Project” la dejamos activada. Como nombre de proyecto en mi caso le pondré “GraficaFacil”.

Creamos un proyecto...

Descomprimimos las librerías previamente descargadas y agregamos los JAR a nuestro proyecto.

Agregamos librerias...

Una vez agregadas vamos a agregar un JFrame a nuestro proyecto.

Agregamos JFrame...

En la opción “Class Name” le ponemos GraficaFacilUI, en la opción “Package” yo le puse “com.seraphinux”; le damos “Finish”

Datos del JFrame...

Como ven nos a generado el “lienzo” de nuestro JFrame en donde podremos agregar nuestra gráfica. Muy bien en este ejemplo en particular crearemos una gráfica del tipo “XYSeries” [JFreeChar proporciona varios tipos de gráficas, para un caso en especial sirvete a consultar la documentación que nos proporciona la pagina del proyecto]

El código no tiene mucha ciencia, así que solo copio y pego, verán que es de lo mas entendible, en este caso graficaremos “Tipo de Cambio mes de Octubre”, estos datos los encontré en la pagina de Ingrammicro.


import java.awt.Graphics;
import java.awt.image.BufferedImage;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 *
 * @author  Seraphinux
 */
public class GraficaFacilUI extends javax.swing.JFrame {
  // Imagen de la grafica
  BufferedImage grafica = null;

  /** Creates new form GraficaFacilUI */
  public GraficaFacilUI() {
    initComponents();
  }

  @SuppressWarnings("unchecked")
  // <editor-fold defaultstate="collapsed" desc="Generated Code">
  }// </editor-fold>

  // Esta funcion toma los valores a graficar
  //  y crea un BufferedImage con ellos
  public BufferedImage creaImagen() {
    XYSeries series = new XYSeries("Tipo de Cambio mes de Octubre");
    series.add(31, 500);
    series.add(30, 500);
    series.add(29, 500);
    series.add(26, 505);
    series.add(25, 510);
    series.add(24, 508);
    series.add(23, 509);
    series.add(22, 506);
    series.add(19, 508);
    series.add(18, 505);
    series.add(17, 505);
    series.add(16, 501);
    series.add(12, 498);
    series.add(11, 501);
    series.add(10, 503);
    series.add(9, 506);
    series.add(8, 509);
    series.add(4, 510);
    series.add(3, 513);
    series.add(2, 514);
    series.add(1, 516);

    XYDataset juegoDatos = new XYSeriesCollection(series);

    JFreeChart chart = ChartFactory.createXYLineChart(
      "Tipo de Cambio mes de Octubre", // Titulo de la grafica
      "Fecha", // Leyenda Eje X
      "Valor Dolar Facturacion", // Leyenda Eje Y
      juegoDatos,
      PlotOrientation.VERTICAL,
      false,
      false,
      false
      );

    // Definimos el tamanio de la grafica
    BufferedImage image = chart.createBufferedImage(350, 350);
    return image;

  }

  /**
  * @param args the command line arguments
  */
  public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
          new GraficaFacilUI().setVisible(true);
      }
    });
  }

  // Sobreescribimos el metodo paint del JFrame para
  //   pintar la imagen de nuestra grafica
  @Override
  public void paint(Graphics g)
  {
    if(grafica == null)
        grafica = this.creaImagen();
    g.drawImage(grafica,30,30,null);
  }

  // Variables declaration - do not modify
  // End of variables declaration

}

Finalmente presionamos F6 para que corra el “Main Project”, el programa queda así.

Proyecto Final...

Nada mal ¿verdad? y mas si tomamos en cuenta lo sencillo que fue crearla; creo que nos tardamos en crear el proyecto que en generar la gráfica. Espero les sea de utilidad y les permita crear programas mas completos.

Posts Relacionados
  • 0 Comentarios

    Rebuscando por la red sobre JOGL, GLCanvas y esas yerbas… me encontré con una interesante pagina en donde tienen un “monton” de tutoriales sobre JOGL. De momento no he tenido tiempo de probarlos (me ando peleando con un “spider”) pero a “ojo de buen cubero” se ven interesantes. Les dejo el enlace para que les “echen un ojo”.


Penguin - Cliente Twitter. Version Alpha

Wednesday, October 1st, 2008

Me dije a mi mismo: -”Sí Stallman se hizo su propio compilador, por que carajos no podría hacerme yo mi propio cliente Twitter“- Así que me puse manos a la obra y usando (de momento) la librería Twitter4J me puse a desarrollar mi propio cliente, programado en Java.

De momento esta en version Alpha; hasta este momento:

  • Puedes “loguearte”
  • Ver tus últimos mensajes enviados
  • Crear mensajes nuevos

Como pueden ver de momento es muy básico, pero espero en posteriores versiones agregar la administración de diferentes usuarios, la administración de amigos (friends), la administración de nuestro perfil, además de mejorar la interfaz para que se vea mas “in”. Y claro habilitar el funcionamiento Asíncrono.

Penguin: Ventana de login.

Penguin: Ventana Mensajes.

Penguin: Ventana de Envio.

Este proyecto esta liberado de momento bajo licencia Creative Commons (espero liberarlo bajo GPL mas adelante).

Dejo a su disposición el JAR. Digo para un día de trabajo no me quedo nada mal :D

Posts Relacionados

Twitter + Java (Twitter4J)

Wednesday, October 1st, 2008

Twitter se va postulando como la aplicación estrella de la WEB2.0 (no es para tanto) así que si te interesa crear una aplicación con Java (hay API’s para C++, C#, Python, Ruby, etc.) que conecte con Twitter, creo que este ejemplo te puede servir.

Para conectarnos con Twitter usamos una Librería Java llamada Twiter4J:

Twitter4J is a Java library for TwitterAPI.
With Twitter4J, you can easily integrate your application with the Twitter service.
Requeriments
OS: Windows or any flavor of Unix that supports Java.
JVM: JDK1.4.2 or later
License
Twitter4J is released under a BSD-style license.

Así que corre a descargarla a [Twitter4J]

Por cierto esta NO es la única librería para Java, en otros post mostraremos como usar otras librerías.

Una vez que la hemos descargada la agregamos a nuestro proyecto (estoy usando Netbeans). El código de esta sencilla aplicación es el siguiente:


package twitter4j01;

import java.util.List;
import twitter4j.Status;
import twitter4j.Twitter;

/**
 *
 * @author Seraphinux
 */

public class Main {
  public static void main(String[] args) {
    System.out.println("Ejemplo con la API Twitter4J");

    // Datos del usuario para el loggueo
    String tUser = "userTwitter";
    String tPass = "passTwitter";

    // Creamos el objeto Twitter con nuestros datos
    Twitter myTwitter = new Twitter(tUser, tPass);

    try{

        // Obtenemos los ultimos status publicados
        // las ultimas 24hrs, para el usuario loggeado
        List<Status> utl = myTwitter.getUserTimeline();

        for(Status a : utl){
          // Obtenemos el avatar del usuario loggueado
          System.out.println("Imagen: " +
                a.getUser().getProfileImageURL().toString());

          // Obtenemos la fecha de creacion del mensaje
          System.out.println("Fecha: " + a.getCreatedAt());

          //Obtenemos el mensaje
          System.out.println("Mensajes: " + a.getText());
        }

    }catch(Exception e){
      // Por si tenemos errores
      System.err.println(e.getMessage());
      System.exit(-1);
    }

    System.exit(0);
  }

}

Las funciones que nos proporciona esta sencilla librería (Twitter4J) no solo se limitan a esto, podemos crear nuevos status, mandar y recibir mensajes de los usuario; como quien dice podemos usar y administrar nuestra cuenta Twitter tal y como si estuviéramos en la web.

En posteriores post, crearemos una aplicación con GUI para esta librería, además de que probaremos las otras librerías existentes.

Posts Relacionados
  • 0 Comentarios

    A mi consideración estos son algunos de los muchos tips (consejos) que deberíamos tomar en cuenta cuando programamos alguna aplicación con acceso a DB.

    1. Cierra siempre las conexiones.
    2. Usa siempre PreparedStatements para declaraciones regulares.
    3. Mantente siempre preparado para cambiar las bases de datos (Nada de instrucciones especificas para una DB).
    4. Nunca uses referencias especificas a una libreria de base de datos (Que tu programa no sea especifico para una DB).
    5. Nunca utilices los procedimientos almacenados (Stored Procedures) de la DB* (Igual que 3 y 4).

Java: Cambiar el cursor por defecto

Sunday, September 21st, 2008

import java.awt.Button;
import java.awt.Component;
import java.awt.Cursor;

import javax.swing.JFrame;

public class MiCursor {
  public static void main(String args[]) {

    // Creamos un frame
	JFrame frame = new JFrame();

	// Creamos un boton
	Component boton = new Button("Aceptar");

	// El cursor del boton por default
	// es Cursor.DEFAULT_CURSOR
	Cursor cursor = boton.getCursor();

	// Cambiamos el cursor
	boton.setCursor(
	  Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)
	);

	// Agregamos el boton
	// hacemos el frame visible
	frame.getContentPane().add(boton);
	frame.setSize(150, 100);
	frame.setDefaultCloseOperation(
	  JFrame.EXIT_ON_CLOSE
	);
	frame.setVisible(true);
  }
}
Posts Relacionados