Applet con gráficas JFreeChart

Os mostramos como mostrar en un applet las graficas generadas por JFreeChart sin necesidad cargar las clases en el cliente

Desarrollo de Applets

Uno de los desarrollos que más ha contribuido al arranque de Java, fue el
desarrollo de las llamadas Applets.

Un applet es un pequeño componente Java de se enlaza a una página Html.

Al descargarse un navegador nuestra página Html, detecta la etiqueta que
identifica al applet y arranca una máquina virtual. Posteriormente, solicita
los ficheros necesarios para la ejecución e inicializa el programa.

Hay un punto clave que hay que tener en cuenta para que las applets
funcionen… la configuración de seguridad del navegador …

Los applets son elementos que se deben utilizar con cuidado porque mucha
gente es reacia a autorizar que se ejecute su código… además, es muy posible
que en Internet con líneas de comunicación lentas… no sea muy factible su
utilización.

Otrotutorial que tenemos sobre JFreeChart ha presentado mucho interés… y mucha
gente me ha preguntado como usarlo desde un applet.

En un primer paso… vamos a hacer una cosa más curiosa ….. seguir usando
nuestro servlet para generar las gráficas dinañicamente en el servidor (y no
tener que distribuir las clases a través de internet… y desde un applet
llamar a este servlet para que nos genere la grafica deseada… es decir, la
imagen.

El código de nuestro applet es bastante sencillo…

La dinamica es sencilla

Extendemos una clase de applet

public class appletsimple extends Applet
implements ImageObserver

Al arrancar el applet, cargamos la imagen

           
URL trayectoBase = this.getCodeBase();
           
depura(«El trayecto base es: » + trayectoBase.toString());
            
            URL
trayectoImagen = new URL(trayectoBase,»imagen.jpg»);
            
           
this.getAppletContext().showStatus(trayectoImagen.toString());
           
depura(«El fichero es » + trayectoImagen.toString());
            
            iMiGrafica =
getImage(trayectoImagen);

Y pintamos en pantalla la imagen

      
g.drawImage(iMiGrafica,50,60,this);
 

 /*
 * appletsimple.java
 *
 * Created on 21 de septiembre de 2003, 16:06
 */

package appletroberto;

/**
 *
 * @author  Administrator
 */

import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.awt.image.*;

public class appletsimple extends Applet implements ImageObserver
{
    Image iMiGrafica = null;

    public void init()
    {
        depura("Inicializamos el applet");
    }



    public void paint(Graphics g)
    {
        g.drawString("Este es el mensaje", 50,50);

        depura("Pintamos cadena");
        g.drawImage(iMiGrafica,50,60,this);
    }

    public void start() {

        depura("Arranque de la App");

        try
        {
            URL trayectoBase = this.getCodeBase();
            depura("El trayecto base es: " + trayectoBase.toString());

            URL trayectoImagen = new URL(trayectoBase,"imagen.jpg");

            this.getAppletContext().showStatus(trayectoImagen.toString());
            depura("El fichero es " + trayectoImagen.toString());

            iMiGrafica = getImage(trayectoImagen);
        }
        catch (Exception e)
        {
            depura("Error al cargar Imagen");
        }
    }


    public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height)
    {
        if (infoflags == ImageObserver.ALLBITS)
        {
            depura("Ya se ha cargado");
            repaint();
        }

        return true;
    }

    void depura(String pCadena)
    {
        System.out.println("Mensaje: " + pCadena );

    }
}   

Ahora creamos una página html con la etiqueta adecuada

<html>
<body>

<p align=»left»>
<applet width=»300″ height=»300″
code=»appletroberto.appletsimple.class» 
codebase=»./»>Applet que muestra imagen simple</applet>
</p>

</body>
</html>

Para probar nuestro programa … ejecutamos la aplicación de prueba appletviewer
que viene con el JSDK

Y el resultado del programa es:

Ahora, si queremos que nuestro applet utilice el servlet que
genera la gráfica, solamente debemos cambia la URL para llamar al servlet.

Ahora modificamos nuestro servlet para pasarle los datos que
queremos pintar

/*
* servletGeneradorGraficaDinamica.java
*
* Created on 21 de septiembre de 2003, 17:46
*/
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 servletGeneradorGraficaDinamica extends HttpServlet 
{

public JFreeChart crearChart(int array[])
{
XYSeries series = new XYSeries(«Evolucion Sesiones»);

// inicializamos los valores pasados
for (int i=0; i<array.length; i++)
{
series.add(i, array[i]);
}

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();

int ancho = getParamEntero(request,»ancho»,300);
int alto = getParamEntero(request,»alto»,300);

// esto es una ñapa paro de momento solo queremos demostrar que funciona
int iNumeroElemento = getParamEntero(request,»elementos»,3);

int array[] = new int[iNumeroElemento];

// leemos variables al estilo y0=1 y1=2 y3=22
for(int i = 0; i< array.length;i++)
{
array[i] = getParamEntero(request,»y» + i ,0);
}

JFreeChart grafica = crearChart(array);
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);
}

}

Vamos a probar el servlet por separado

Solicitamos nuestra URL

http://localhost:8081/servlet/servletGeneradorGraficaDinamica?elementos=3&y0=2&y1=33&y2=23

Y vemos el resultado

Y ahora readaptamos el applet para solicitar una imagen en la
URL.

    public void start() {

        depura("Arranque de la App");

        try
        {
            URL trayectoBase = this.getCodeBase();
            depura("El trayecto base es: " + trayectoBase.toString());
       //URL trayectoImagen = new URL("http://localhost:8081/servlet/servletGeneradorGraficaDinamica?
       //elementos=3&y0=2&y1=33&y2=23$ancho=200&alto=300"); Tambien podriamos indicar tamaño

            URL trayectoImagen = new URL("http://localhost:8081/servlet/servletGeneradorGraficaDinamica?elementos=3&y0=2&y1=33&y2=23");

            this.getAppletContext().showStatus(trayectoImagen.toString());
            depura("El fichero es " + trayectoImagen.toString());

            iMiGrafica = getImage(trayectoImagen);
        }
        catch (Exception e)
        {
            depura("Error al cargar Imagen");
        }
    }

Para que esto funcione en un navegador Web externo… debemos
tener la precaución de copiar todos los ficheros del applet y la página HTML
al directorio Web de nuestro servidor (pero no copiar los .java)

Es probable que en vuestra página Web no funcione bien ….
mirar las opciones de seguridad y …. ya hablaremos de la firma
digital de applets
para evitar problemas …. pero …eso será en otro
tutorial …

La verdad es que es bastante sencillo ¿verdad?

 

Sobre
el Autor ..

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia S.L., Profesor asociado en IE Business School, inversor en StartUps y mentor de emprendedores. Ingeniero Técnico de Telecomunicaciones y Executive MBA por IE Business School 2007. Twitter: Follow @rcanalesmora Autor de los Libros: Planifica tu éxito: de aprendiz a empresario, Informática profesional, las reglas no escritas para triunfar en la empresa, Conceptos ágiles aplicados a distintas áreas de una empresa y Conversaciones con CEOs y CIOs sobre Transformación Digital y Metodologías Ágiles. ¡Descárgalos gratis aquí! Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aquí.

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

30/10/2025

Benjamín Suárez Menéndez

El Complex Problem Solving (CPS) es un proceso estructurado basado en herramientas, técnicas y actitudes que nos facilita la resolución de problemas complejos.

03/10/2025

Miguel García Rodríguez

Descubre cómo el diseño y la psicología del comportamiento utilizan sesgos cognitivos para influir en la toma de decisiones de los usuarios y potenciar la persuasión.

30/09/2025

Iván García Sainz-Aja

En este artículo exploraremos cómo utilizar ZenWave360 para generar un proyecto completo de Spring Boot con Kotlin a partir de un modelo DSL de Lenguaje Ubicuo.