Suscribirse al Feed
30Oct

Los Applets de Java

En esta entrada trataremos, no muy profundamente, los applets de Java. Pero ¿Qué son?

Una applet Java es una applet escrita en el lenguaje de programación Java. Los applets de Java pueden correr en un navegador web utilizando la Java virtual machine (JVM), o en el AppletViewer de Sun.

Entre sus características podemos mencionar un esquema de seguridad que permite que los applets que se ejecutan en el equipo no tengan acceso a partes sensibles (por ej. no pueden escribir archivos), a menos que uno mismo le dé los permisos necesarios en el sistema; la desventaja de este enfoque es que la entrega de permisos es engorrosa para el usuario común, lo cual juega en contra de uno de los objetivos de los Java applets: proporcionar una forma fácil de ejecutar aplicaciones desde el navegador web.

Hace unos días colocaba una entrada acerca de la implementación del algoritmo de encriptación RSA en Java, y además el cómo crear una interfaz gráfica en Swing para dicha implementación. En esa ocasión creamos una interfaz gráfica para una ventana usando la clase JFrame, ahora por petición de algunos, vamos a hacer lo mismo con un JApplet.

Por supuesto no voy a explicar de la misma forma como antes, el cómo crear una interfaz, sino que simplemente adaptaremos la que ya tenemos en el JFrame para que trabaje con JApplet. La cosa es bastante simple, solo tenemos que modificar unas cuantas cosillas al código fuente de la GUI anterior:

  1. Los Applets de Java no usan el método main, así que podemos comenzar por borrar este método.
  2. Entonces, cuando la máquina virtual de java, ejecuta un Applet, no busca el método main sino el método init(). Por lo general a dicho método, le encargamos las tareas de inicialización de variables y objetos. Por tanto, es muy parecido al constructor de una clase. Siendo así, podemos simplemente modificar el constructor anterior (public VentanaRSA()) poniedo: public void init().
  3. Como vamos a hacer un applet de swing, ya no heredamos de la clase JFrame sino de la clase JApplet, por lo que cambiamos la línea que decía:
    public class VentanaRSA extends JFrame implements ActionListener
    Por:
    public class AppletRSA extends JApplet implements ActionListener

El resto sigue igual, respecto al anterior código. Como ya mencionamos antes, un applet corren sobre navegadores web, por lo que necesitamos un archivo HTML que contenga nuestro applet. Incrustar un applet en una página web es sumamente sencillo, basta con colocar las etiquetas adecuadas:


<html>
<applet code = "AppletRSA.class" width = "650" height = "300">
</applet>
</html>

Como podemos observar, se usan las etiquetas applet, y se le asignan algunos atributos. Lo básico y necesario es colocar el atributo code que apunta hacia la clase compilada de nuestro applet, y los atributos width y height para asignar el ancho y alto del applet, respectivamente.

Ahora, en fase de desarrollo, podemos usar una herramienta llamada appletviewer incluida dentro del J2SDK. Con dicha herramienta, podemos probar y depurar nuestros applets. Su uso es muy sencillo:

appletviewer PaginaHTML.html

Así, se ejecutará una ventana que contiene nuestro applet. Luego de que ya esté lista, la ejecutamos desde una navegador y listo. Desde Firefox:

applet 1

pplet 2

Descargas y enlaces

27Oct

Google actualiza por fin el PageRank

La cima de Google PR

Pues eso… después de casi 3 meses al fin ha actualizado el bendito pagerank! Y pues, a cada quien se le dió lo que se merece XD Mi salto fue de 0 a 4, y con esto estabilizo lo conseguido con mi antiguo blog.

Visto en DosBit

27Oct

¿Porqué no tengo novia?

1. Burlarte de ella cuando usa Internet Explorer. También de como lo usa. También cuando busca en google una URL en vez de ponerla directamente en la barra de direcciones.

2. Burlarte de su PC con Windows. A ti te gusta tu Mac o tu PC con Linux y Compiz Fusion, tu cubo, tus iconos de calidad fotográfica, tu barra iconos animados…

3. Burlarte de su teléfono móvil. Está medio destrozado y le cuelga algún tipo de monigote. Tu usas el penúltimo modelo con cámara de 3Mpx y 1Gb de memoria.

4. Burlarte de ella cuando usa MSN, MySpaces o cualquier otra chuza de Microsoft. Tu GAIM y otras herramientas libres son mas bonitas y mucho más… libres.

5. Intentar establecer una conversación en base a una noticia aparecida en Meneame o en Digg…

6. Intentar engancharla a Stargate o a Star Trek. Intentar visionar sin que se duerma cualquiera de las trilogias míticas (Star Wars, El Señor de los Anillos, Superman, Alien…)

7. Pasar más de 8 horas seguidas delante de un ordenador. “Poniendolo guapo”.

Visto en | UbuntuLife » Bynario

26Oct

Implementación del algoritmo de encriptación RSA en Java (parte 2)

Creación de la interfaz gráfica de usuario usando Swing

Siguiendo el anterior capítulo de este artículo, ahora crearemos el front-end para usar el programa de encriptación/desencriptación. Y aquí me gustaría tratar de mostrarles cómo crear interfaces gráficas desde cero, usando la “técnica” que yo uso. Esto puede parecer muy tonto para algunos, pero en verdad son muchos los casos en los que he visto a las personas de mi universidad maldiciéndo por no poder crear una bendita GUI. Por esto, me gustaría enfatizar en la creación de GUIs.

Lo primero es imaginarse como podría ser el diseño… poner la mente a trabajar, coger papel y lápiz y comenzar a diseñar. Y lo primero que se me ocurre es algo como esto:

rsa mano alzada 2

rsa mano alzada

Lo primero que salta a la vista es que: como artista me muero de hambre, y como editor de gráficos digitales: peor. Pero hasta aquí lo importante es tener claro qué se va a hacer. Una vez escogemos cual de los dos diseños vamos a usar (prefiero el segundo), a programar se dijo! Ten en cuenta que como vamos a usar Swing, debemos importar el paquete javax.swing.

Ahora, lo primero es crear la ventana que contendrá nuestro programa, para lo cual utilizaremos un objeto JFrame. Y comenzar a pensar cómo se van a distribuir los objetos dentro de la misma, para lo cual se hace uso de los “layouts”… tenemos muchas opciones, de las cuales me gustaría comentarles las más importantes y luego decidiremos cual es la más adecuada:

  • Es posible crear los objetos de la interfaz de usuario, y asignarles coordenadas y tamaños específicos dentro de la ventana (hazlo solo cuando sea verdaderamente necesario).
  • Es posible usar GridLayout, que nos permitirá manejar el contenido de la ventana como si fuera una tabla de X por Y celdas. Dentro de cada celda colocaríamos un objeto de la GUI.
  • Otra opción es usar BorderLayout, que nos permite distribuir los objetos en cinco espacios: norte, sur, este, oeste y centro, siendo este último el más grande de todos.

Lo primero es ver qué coincidencias existen entre las posiciones de los objetos, y lo diagramamos de nuevo en papel:

rsa cuadricula

Como podemos ver, en el área más grande (la de abajo, en verde) hay dos áreas de texto que ocupan el mismo tamaño… así que una buena opción sería meterlas en un GridLayout que tenga una fila y dos columnas. Arriba (en rojo), aunque no es la mejor interpretación que he hecho (la cuestión es que quede lo más sencillo posible), podemos observar que hay una cuadrícula de dos filas por tres columnas.

Así que lo más conveniente es usar dos contenedores que usen GridLayout. Uno para arriba, y el otro para abajo (¿o para el centro?). Y al JFrame, asignar el layout BorderLayout, situando dichos contenedores en NORTH y CENTER (se ve un poco mejor que en la hoja, pero solo un poco… al fin y al cabo no me había quedado tan feo):

swing rsa

Lo que en dividiéndolo mentalmente sería:

rsa swing cuadricula

Además de esto, tenemos que decidir como vamos a manejar los eventos de la GUI, es decir, qué hacer cuando el usuario le dé clic en el botón “Generar Claves” o en el boitón de radio “Encriptar”, y para ello me gustaría enseñarles en este mismo programa 3 difirentes tipos de usar eventos:

  • Desde una clase interna anónima
  • Desde una clase interna
  • Desde un método dentro de la clase

Pero vamos por partes… Con el fin de que entendamos y aprendamos de una manera más sencilla, explicaré parte por parte la clase VentanaRSA.java, comencemos con la importación de paquetes y la declaración de la misma:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.math.BigInteger;
public class VentanaRSA extends JFrame implements ActionListener{

No hay mucho que explicar aquí: importamos los paquetes para interfaces gráficas Swing y AWT, además del paquete que contiene las clases para manejar eventos y la clase BigInteger. Al declarar la clase (como va a ser una ventana) heredamos de la clase JFrame e implementamos la interfaz ActionListener para manejar eventos. Ahora declaramos los objetos que usaremos, y posteriormente los iniciaremos en el constructor:

private JTextField cajaTamPrimo;

    private JButton btnGenenerarClaves;
    private ButtonGroup grupoBotonesOpcion;
    private JRadioButton btnEncriptar, btnDesEncriptar;
    private JTextArea areaOrigen, areaDestino;
    private Container cntAreas, cntGenClaves;
    private RSA rsa;
    private BigInteger[] textoCifrado;

En el constructor de la clase vamos a iniciar los objetos con sus respectivos valores, además de asignarle un manejador de eventos a cada objeto de la interfaz gráfica:

public VentanaRSA() {

        super("Interfaz Grafica - RSA");
        
        getContentPane().setLayout(new BorderLayout(3,3));
        
        cajaTamPrimo = new JTextField();
        cajaTamPrimo.addActionListener(
                new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                generarClaves();
            }
        });
        
        btnGenenerarClaves = new JButton("Generar Claves");
        btnGenenerarClaves.addActionListener(this);
        
        btnEncriptar = new JRadioButton("Encriptar", false);
        btnEncriptar.addActionListener( new ManejadorBotonOpcion() );
        btnEncriptar.setEnabled(false);
        btnDesEncriptar = new JRadioButton("Desencriptar", false);
        btnDesEncriptar.addActionListener( new ManejadorBotonOpcion() );
        btnDesEncriptar.setEnabled(false);
        
        grupoBotonesOpcion = new ButtonGroup();
        grupoBotonesOpcion.add(btnEncriptar);
        grupoBotonesOpcion.add(btnDesEncriptar);
        
        areaOrigen = new JTextArea();
        areaOrigen.setWrapStyleWord(true);
        areaOrigen.setLineWrap(true);
        areaDestino = new JTextArea();
        areaDestino.setLineWrap(true);
        areaDestino.setEditable(false);
        
        cntAreas = new Container();
        cntGenClaves = new Container();
        
        cntGenClaves.setLayout(new GridLayout(2,3));
        cntGenClaves.add(new JLabel("Digita el tamaño del número primo: "));
        cntGenClaves.add(cajaTamPrimo);
        cntGenClaves.add(btnGenenerarClaves);
        cntGenClaves.add(new JLabel("Digita el texto a cifar/descifrar:"));
        cntGenClaves.add(btnEncriptar);
        cntGenClaves.add(btnDesEncriptar);
        
        cntAreas.setLayout(new GridLayout(1,2,5,5));
        cntAreas.add(new JScrollPane(areaOrigen));
        cntAreas.add(new JScrollPane(areaDestino));
        
        getContentPane().add(cntGenClaves, BorderLayout.NORTH);
        getContentPane().add(cntAreas, BorderLayout.CENTER);
        
        setSize(650,300);
        setVisible(true);
    }

Paso a explicar lo más importante:

  • El método super sirve para iniciar el objeto del cual hereda una clase y en este caso, que redamos de JFrame, le enviamos el texto que va a tener la barra del título de la ventana.
  • Con el método getContentPane, asignamos a la ventana el layout que administrará su contenido… en este caso un BorderLayout.
  • He aquí una parte interesante, vamos a definir el primer manejador de eventos usando una clase inrterna anónima. Esta se la asignamos al objeto cajaTamPrimo, y nos permitirá manejar los eventos que genere dicho objeto (en este caso el evento es que se de Enter despues de escribir algo sobre esta caja de texto).
    • Lo primero es usar el método addActionListener para adicionar un manejador de eventos. Este método recibe un objeto que haya implementado la interfaz ActionListener, que manejará los eventos.
    • Fijémonos que creamos una clase de tipo ActionListener, y por ende debemos redeclarar el método actionPerformed, el cual será invocado al producirse un evento. En este caso, cuando alguien escriba algo sobre la caja de texto y presione Enter, se invocará el método generarClaves().
  • Ahora utilizaremos otra técnica para manejar eventos: se trata de que, como en este caso, la clase principal (VentanaRSA.java) implemente la interfaz ActionListener, y dicha clase maneje eventos. Te recuerdo que al implementar la interfaz ActionListener, una clase está obligada a declarar el método actionPerformed, vaya o no a usarlo. Esta vez vamos a asociar este manejador de eventos al botón “Generar claves” (btnGenenerarClaves), usando el método addActionListener así: btnGenenerarClaves.addActionListener(this).
    • Cabe notar aquí, que usamos la palabra this, para indicar al método addActionListener, que el manejador de eventos del botón btnGenenerarClaves, será la misma clase donde este se encuentra.
  • Hora de usar la tercera técnica de manejo de eventos… esta vez se trata de usar una clase interna, en donde se implementará alguna interfaz de manejo de eventos (en este caso la ya mencionada ActionListener)… esta técnica la vamos a usar para manipular los eventos generados por los botones de radio, y su uso es muy sencillo: basta con crear un objeto de la clase dentro del método addActionListener así: btnEncriptar.addActionListener( new ManejadorBotonOpcion() ); Más adelante veremos cómo está construida la clase ManejadorBotonOpcion
  • Con respecto a la inicialización de los otros objetos de la GUI no creo que haya mucho que explicar, pero me gustaría recalcar el método setEnabled() que es bastante útil. Este método lo poseen casi todos los objetos de interfaz gráfica, y sirve para habilitar/inhabilitar los objetos mismos. Recibe un valor booleano, y por ejemplo cuando hacemos: btnEncriptar.setEnabled(false);, estamos indicando que el objeto btnEncriptar va a estar inhabilitado.
  • El manejo de contenedores en muy simple. Recordemos que usaremos dos contenedores: uno para las areas de texto de abajo, y el otro para los objetos de arriba. Los contenedores no son más que objetos de la clase Container, a los que les asignamos un layout que distribuirá los objetos que contenga. En nuestro caso, recordemos que el contenedor superior será una cuadrícula de 2X3 celdas, por lo cual podremos asignar dicho layout de la siguiente forma: cntGenClaves.setLayout(new GridLayout(2,3)) Una vez hayamos definido el administrador de contenido, nos dispondremos a añadir los objetos de la interfaz gráfica que contendrá… esto lo hacemos con el método add, que no solo recibe objetos de la GUI, sino también otros contenedores: cntGenClaves.add(cajaTamPrimo);
  • Otra cosa interesante por notar es el uso de los scrolls (JScrollPane), en este caso lo usamos para envlover las areas de texto (JTextArea), ya que posiblemente contendrán muchas letras y si es necesario que pueda mostrarnoslas todas. Para ello, al añadir el objeto al contenedor NO hacemos esto: add(areaOrigen) SINO que cargamos el area dentro del scroll así: add(new JscrollPane(areaOrigen)) De lo contrario lo más seguro es que no podamos acceder al texto que se encuentre abajo, cuando ya no quepa más.
    • Además de los Scrolls, podemos usar los métodos setLineWrap y setWrapStyleWord, que no permitirá scrolls horizontales (causados por ejemplo por palabras muy largas).
  • Al momento de añadir objetos al JFrame, lo podemos hacer directamente invocando el método getContentPane seguido del método add. En este caso, como usamos el layout BorderLayout, debemos pasarle un parámetro adicional al método add, que le indicará en qué parte situará el objeto (arriba, abajo, izquierda, derecha o centro), dicho parámetro es un entero que podemos tomar de las variables públicas estáticas de la clase BorderLayout… por ejemplo para situar el contenedor cntGenClaves arriba debemos poner lo siguiente: getContentPane().add(cntGenClaves, BorderLayout.NORTH);
  • Por último, para asignarle un tamaño a la ventana y hacerla visible (por defecto viene invisible), debemos usar los métodos setSize(650,300) y setVisible(true) respectivamente.

Veamos ahora el método actionPerformed, que será invocado cada vez que el botón btnGenenerarClaves genere un evento:

    public void actionPerformed( ActionEvent evento ) {
        if(evento.getSource().equals(btnGenenerarClaves))
            generarClaves();
    }

Lo único a resaltar aquí es el método getSource de la clase ActionEvent, que en conjunto con el método equals de la clase Object nos permitirá saber quién generó el evento. El siguiente método a tratar es generarClaves, que simplemente invocará los métodos generaPrimos y generaClaves de la clase RSA.java, y nos los mostrará:

private void generarClaves() {

        if(cajaTamPrimo.getText().equals(""))
            JOptionPane.showMessageDialog(null, 
                   "No haz introducido el tamaño del primo",
                   "Tenemos problemas", JOptionPane.ERROR_MESSAGE);
        else {
            rsa = new RSA(Integer.parseInt(cajaTamPrimo.getText()));
            rsa.generaPrimos();
            rsa.generaClaves();
            JTextArea area = new JTextArea(20,50);
            area.setEditable(false);
            area.setLineWrap(true);
            area.append("Tam clave: "+cajaTamPrimo.getText()+"\n\n");
            area.append("p:["+rsa.damep()+"]\n\nq:["+rsa.dameq()+"]\n\n");
            area.append("Clave publica (n,e):\n\nn:["+
			rsa.damen()+"]\n\ne:["+rsa.damee()+"]\n\n");
            area.append("Clave publica (n,d):\n\nn:["+rsa.damen()+"]\n\nd:["
			+rsa.damed()+"]");
            JOptionPane.showMessageDialog(null, new JscrollPane(area),
		"Primos generados", JOptionPane.INFORMATION_MESSAGE);
            btnEncriptar.setEnabled(true);
            btnDesEncriptar.setEnabled(true);
        }
    }

De aquí podemos tomar algunas cosas interesantes…

  • Comencemos con la clase JOptionPane, la cual nos permitirá usar cuadros de diálogo básicos. En este caso solo usamos su método estático showMessageDialog, en donde podremos introducir un texto a mostrar (o un objeto, como veremos ,más adelante), el título del cuadro de diálogo, y un icono a mostrar. En cuanto al icono, podemos escoger entre imágenes referentes a error, información, alarma, pregunta y creo que no más… por ejemplo, para usar el de error podemos hacer JoptionPane.ERROR_MESSAGE
  • Otro punto interesante de la clase JOptionPane, es que en vez de texto simple podemos colocar un objeto gráfico… por ejemplo podemos colocar un objeto JTextArea como en el código de arriba: JOptionPane.showMessageDialog(null, new JscrollPane(area),”Titulo”)

Pasemos entonces a ver cómo está construida la clase interna , que en nuestro caso maneja los eventos de los botones de radio:

private class ManejadorBotonOpcion implements ActionListener {

        
        // manejar eventos de botón de opción
        public void actionPerformed( ActionEvent evento ) {
            if(evento.getSource().equals(btnEncriptar)) {
                if(areaOrigen.getText().equals(""))
                    JoptionPane.showMessageDialog(null,
				"No haz introducido datos para cifrar",
				"Tenemos problemas", JOptionPane.ERROR_MESSAGE);
                else {
                    textoCifrado = rsa.encripta(areaOrigen.getText());
                    areaDestino.setText("");
                    for(int i=0; i<textoCifrado.length; i++)
                        areaDestino.append(textoCifrado[i].toString());
                }
            } else if(evento.getSource().equals(btnDesEncriptar)) {
                if(areaOrigen.getText().equals(""))
                    JoptionPane.showMessageDialog(null,
				"No haz introducido datos para decifrar",
				"Tenemos problemas", JOptionPane.ERROR_MESSAGE);
                else {
                    areaDestino.setText("");
                    String recuperarTextoPlano = rsa.desencripta(textoCifrado);
                    areaDestino.setText(recuperarTextoPlano);
                }
            }
        }
        
    }

Como puedes ver implementa la interfaz ActionListener, por lo que más abajo tiene que declarar el método actionPerformed. Allí adentro se cifran/decifran lo que se haya puesto en una de las areas de texto. La verdad no hay mucho que explicar aquí así que vamos directamente al código del método main:

public static void main(String args[]) {

        JFrame.setDefaultLookAndFeelDecorated(true);
        VentanaRSA ventana = new VentanaRSA();
        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

Aquí solo hay dos cosas por resaltar:

  • JFrame.setDefaultLookAndFeelDecorated(true): esto lo que hace es activar el Look&Feel, y logramos que nuestra ventana se vea bonita y además que se muestre igual en cualquier sistema operativo.
  • ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE): esto nos evita tener que poner a la escucha algún método para cerrar la ventana, es decir, con esto le decimos que cuando el usuario de clic en la X de la esquina superior derecha, se cierre el programa. De otro modo hay que usar otros métodos mucho más complicados.

Bien, eso es todo… probemos entonces el programa!

swing rsa 1

Si no colocamos ningún texto para cifrar/decifrar:

rsa sinwg 2

Ummm, ahora que miro la anterior imágen… ¿se escribe “has” o “haz”? En fin… pasemos a la encriptación:

swing rsa 3

Y la desencriptación (¿o desencripción?)

Como puedes ver… hubo un problema con las tildes y los símbolos netamente castellanos, pero culpa de Java lo juro:(

Descargas y enlaces

26Oct

Blogging Semanal III

26Oct

Full Circle Magazine #6

Contenido:

  • Paso a paso Actualizacion de Feisty > Gutsy
  • How-To : Ejecutar plugins de Photoshop en GIMP, Samba y Scribus.
  • Top 5 - Juegos de Carreras.
  • Entrevista con John Philips (Open Font Library).
  • Cartas, Q&A, Mi Desktop y mucho mas!

Descarga

Visto en UbuntuTips

© 2007 - 2008 Dezinerfolio. Todos los derechos reservados.
Powered by Wordpress. Entradas RSS