## Cómo usar Iconos

Algunos componentes Swing, como JLabel y JButton, pueden ser decorados con un icono -- una imagen de tamaño fijo. En Swing, un icono es un objeto que se adhiere al interface Icon. Swing proporciona una implementación particularmente útil del interface Icon: ImageIcon, que dibuja un icono desde una imagen JPEG o GIF..

> Nota a los programadores AWT: un objeto ImageIcon usa MediaTracker para cargar la imagen desde un nombre de fichero, una URL u otra fuente. ImageIcon es una alternativa manejable y fácil de usar para Image porque ImageIcon maneja la relación con el MediaTracker y sigue la pista del estado de la carga de la imagen. Sin embargo, se puede obtner el objeto Image desde un ImageIcon si necesitamos más control. Puedes ver Usar Imágenes para más información sobre Image y MediaTracker.

Aquí tenemos un applet que usa iconos para dos propósitos diferentes:

> Está es una imagen del GUI del Applet, para ejecutarlo, pulsa sobre ella. El applet aparecerá en una nueva ventana del navegador.

Un icono en una etiqueta impelementa el área fotgráfica del applet. El applet tambíen usa iconos para decorar los botones Previous Picture y Next Picture de la parte inferior de la ventana del applet.

> Prueba esto:
> 1. Ejecuta el applet.
>    El applet anterior se ejecuta usando Java Plug-in. Si lo prefieres, puedes ejecutarlo con un navegador o Applet Viewer que soporte JDK 1.1 y Swing. Aquí está el fichero que contiene la etiqueta <APPLET> para ejecutar el applet IconDemoApplet.java. Para más información sobre la ejecución de applets, puedes ver Eejcutar Applets Swing.
> 2. Pulsa los botones Previous Picture y Next Picture, para ver las fotos.
> 3. Mantén el cursor sobre una foto. Un tool-tip indicará el nombre de la foto actual y su anchura y altura.
> 4. PAra ver tus propias fotos, modifica los parámetros del applet. Necesitarás proporcionar, el nombre, la anchura y la altura para cada foto. Durante la inicialización, el applet lee sus parámetros y almacena la informaicón en un vector de objetos Photo.

Primero veamos el código de IconDemoApplet.java que crea e inicializa las felchas usadas en los botones del applet, porque es un código muy sencillo:

    //create the image icons for the next and previous buttons
    ImageIcon nextIcon = new ImageIcon(getURL("images/LEFT.gif"));
    ImageIcon previousIcon = new ImageIcon(getURL("images/left.gif"));
    ...
    //use them to create a buttons
    previous = new JButton("Previous Picture", previousIcon);
    ...
    next = new JButton("Next Picture", nextIcon);

El único argumentos para el constructor del icono es la URL del fichero que contiene la imagen. El método getURL añade el code base del applet al nombre del fichero que contiene la imagen del applet. Puedes copiar este método para usarlo en tus applets.

    protected URL getURL(String filename) {
        URL codeBase = this.getCodeBase();
        URL url = null;

        try {
            url = new URL(codeBase, filename);
        } catch (java.net.MalformedURLException e) {
            System.out.println("Couldn't create image: badly specified URL");
            return null;
        }
        return url;
    }

La clase ImageIcon proporciona otros muchos constructores para crear iconos desde un array de bytes, una imagen o desde un nombre de fichero.

Ahora veamos el código que carga las fotografías:

    //where the member variables are declared
    Vector pictures;
    ...
    	//early in the init method
            pictures = parseParameters();

    	//create the image icon for the photo
    	Photo first = (Photo)pictures.firstElement();
    	ImageIcon icon = new ImageIcon(getURL(first.filename));
            first.setIcon(icon);
    	...

Este código crea un Vector de objetos Photo (en el método parseParameters que no se muestra). Cada objeto Photo contiene el nombre, el captión, la anchura y la altura de la foto que representa, y después de que la imagen se muestre por primera vez, su icono. El icono para la primera foto es creado en el método init del applet y almacenado en el objeto Photo apropiado.

Los iconos para las otras fotos se almacenan la primera vez que el usuario las ve. Aquí está el código del método actionPerformed de buttons que determina si una imagen ha sido visualizada con anterioridad. Si no, el código crea un nuevo icono y lo almacena:

    Photo pic = (Photo)pictures.elementAt(current);
    icon = pic.getIcon();
    if (icon == null) {
        icon = new ImageIcon(getURL(pic.filename));
        pic.setIcon(icon);
    }
    iconLabel.setText("");
    iconLabel.setIcon(icon);
    iconLabel.setToolTipText(pic.filename + ": " + icon.getIconWidth() +
    			 " X " + icon.getIconHeight());

¿Por qué todo este alboroto para almacenar los iconos? El programa corre mucho más rápido porque los iconos son creados sólo una vez y las correspondientes imágenes también solo se cargan una vez. Si eliminamos explicitamente el almacenamiento de iconos de este prorama, una segunda visualización de un foto parecerá suceder más rápidamente que la primera. Esto implica que algún almacenamiento implícito está sucediendo en la plataforma Java. Sin embargo, esto es un efecto colateral de la implementación y no está garantizado.

El código también selección el tool-tip de la foto: el programa llama a los métodos getIconWidth y getIconHeight de IgameIcon para obtener información sobre el tool-tip. La anchura proporcionadas por el icono son más correctas que las proporcionadas por los parámetros del applet.

#### El API de Icon

> La siguientes tabñas listan los métodos y constructores más usados de ImageIcon. El API para isar Iconos se divide en tres categorías:
> - Seleccionar u Obtener la Imagen dibujada por el Icono
> - Seleccionar u Obtener información sobre el Icono
> - Vigilar la Carga de la Imagen del Icono

> Seleccionar u Obtener la Imagen Dibujada por el Icono
> Método o Constructor | Propósito
> --- | ---
> ImageIcon(byte[]) ImageIcon(byte[], String) ImageIcon(Image) ImageIcon(Image, String) ImageIcon(String) ImageIcon(String, String) ImageIcon(URL) ImageIcon(URL, String) | Crea un ejemplar de ImageIcon, inicializando su contenido con la imagen especificada. El primer argumento indica la fuente -- imagen, array de bytes, nombre de fichero o URL -- desde la que se debería cargar la imagen del icono. El segundo argumento, cuando existe, proporciona una descripción para la imagen. La descripción es una descripción corta y textual de la imagen que podría ser usada en varias formas, como texto alternativo de la imagen.
> void setImage(Image) Image getImage() | Selecciona u obtiene la imagen mostrada por el icono.

> Selecionar u Obtener Información sobre el Icono
> Método | Propósito
> --- | ---
> void setDescription(String) String getDescription() | Selecciona u obtiene una descripción de la imagen.
> int getIconWidth() int getIconHeight() | Obtiene el tamaño de la imagen del icono.

> Vigilar la Carga de la Imagen del Icono
> Método | Propósito
> --- | ---
> void setImageObserver(ImageObserver) ImageObserver getImageObserver() | Selecciona u Obtiene un image observer para la imagen del icono.
> int getImageLoadStatus() | Obtiene el estado de la carga de la imagen del icono. El conjunto de valores devueltos por este método está definido por MediaTracker.

#### Ejemplos que usan Iconos

> La siguiente tabla lista unos pocos de los muchos ejemplos que usan ImageIcon.

> Ejemplo | Dónde se describe | Notas
> --- | --- | ---
> IconDemoApplet.java | Esta página. | Un applet que usa una etiqueta para mostrar imagenes grandes y dos botones que tienen tanto imagenes como texto.
> ButtonDemo.java | Cómo usar Buttons | Muestra como usar Iconos en los botones de una aplicación.
> CheckBoxDemo.java | Cómo usar Check Boxes | Usa múltiplés imágenes JPEG.
> LabelDemo.java | Cómo usar Labels | Demustra el uso de iconos en las etiquetas de una aplicación, con y sin texto de acompañamiento.
> DialogDemo.java, CustomDialog.java, | Cómo hacer Dialogs | Muestra como usar Iconos estándard en los cuadros de diálogo.
> TreeIconDemo.java | Cómo usar Trees | Muestra como cambiar los iconos mostrados en los nodos de un árbol.
> ActionDemo.java | Cómo usar Actions | Muestra cómo especificar el icono de una botón de una barra de herramientas o un ítem de menú usando un Action.

Ozito