Applet con gráficas JFreeChart

0
40258

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 ..

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

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

Por favor ingrese su nombre aquí

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

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad