Java – AWT/Swing – Cambiar el icono de una ventana

Al trabajar con ventanas en Java, notaremos que estas llevan por defecto el icono con el símbolo de Java el cual es una taza de café.

No es fea la taza de café, pero en un JFrame podemos cambiarlo a nuestro gusto, y aunque no podemos hacer lo mismo en un JDialog este heredara el icono de su ventana padre. Incluso podríamos cambiar el icono que usa Java por defecto para sus aplicaciones, aunque claro que seria algo drástico.

Cambiando el icono en nuestro JFrame


Para personalizar nuestro icono en un JFrame utilizaremos el método void setIconImage(Image image), veamos un simple ejemplo:

package programa;

import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

class WindowDemo extends JFrame {

    public WindowDemo() {
        super("Ventana personalizada");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Image icon = new ImageIcon(getClass().getResource("/programa/imagenes/love.png")).getImage();
        setIconImage(icon);

        setSize(350, 350);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        new WindowDemo();
    }
}

Como se puede ver tengo una clase en el paquete programa y tengo una imagen llamada love con extensión .PNG en el paquete programa.imagenes.

En el código que hemos visto prestemos atención sobre:

    Image icon = new ImageIcon(getClass().getResource("/programa/imagenes/love.png")).getImage();
    setIconImage(icon);

Al método void setIconImage() hay que pasarle nuestra imagen como argumento, utilizamos new ImageIcon(URL location).getImage() donde el argumento location lo obtenemos a través del método getClass().getResource(String name) que nos devuelve un URL absoluto del recurso que especificamos como String. Los tipos de archivo que podemos utilizar son GIF, JPEG yPNG (este último desde J2SE 1.3) pero no pueden ser ICO o BMP. En caso de utilizar un tipo de archivo no valido el icono predeterminado simplemente no cambiara y seguiremos viendo la taza de café, y en caso de que el archivo no se encontrase el método retornaría null y la JVM nos arrojaría una NullPointerException.

Tanto JDialogs como JInternalFrames que tengan este JFrame como padre llevarían el mismo icono.

Veamos como queda ahora nuestra ventana:

Y como alternativa al código anterior tenemos otra forma muy similar de lograr el mismo resultado:

    Image icon = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/programa/imagenes/love.png"));
    setIconImage(icon);

– Desde un editor visual –

Trabajando con editores visuales las cosas pueden ser diferentes, sin duda el caso mas especial es el editor visual de NetBeans que veremos a continuación.

– NetBeans –

En el caso que estemos trabajando con el editor visual de NetBeans (Matisse) no podemos modificar manualmente el código generado, así que seleccionamos el JFrame en la pestaña  “Inspector” y luego en la pestaña de propiedades (“JFrame – Properties“) buscamos la  propiedad “iconImage” seleccionando donde se ve a continuación:


Se nos abrirá una ventana con nuevas opciones en la cual seleccionamos “Custom Code” y como veremos tenemos un campo de texto donde podremos escribir nuestro código para aplicar el método void setImageIcon(). Siguiendo con mi ejemplo donde tengo el archivo de imagen love.png en el paquete programa.imagenes el código a introducir sería:

new ImageIcon(getClass().getResource("/programa/imagenes/love.png")).getImage()

Nos quedará algo como esto:

Al presionar “Ok” el editor visual introducirá nuestro código donde debe.

– Eclipse –

En el caso del Visual Editor de Eclipse podemos modificar manualmente el código generado sin ningún problema, sin embargo veremos como hacerlo desde el editor mismo sin tener que tocar código. En la pestaña “Java Beans” seleccionamos el JFrame y luego en la pestaña de propiedades “Properties” buscamos la propiedad “iconImage” seleccionando donde se ve a continuación:

Se nos abrirá una ventana con nuevas opciones en la cual nos aseguramos que la casilla “Proyect” este seleccionada, entonces siguiendo con mi ejemplo buscamos y seleccionamos en el árbol de paquetes el archivo de imagen love.png que se encuentra en el paquete programa.imagenes tal como vemos a continuación:

Al presionar “Ok” el editor visual generará el código correspondiente donde debe.

Cambiando el icono predeterminado de Java


Como mencione antes podemos cambiar el icono por defecto que usa Java para nuestras aplicaciones. Lo que significa que todas las aplicaciones Java que ejecutemos en nuestro PC que no tengan icono propio llevaran el icono por defecto que nosotros habremos especificado.

El icono de Java es guardado dentro de una DLL que se encuentra en el directorio de instalación de Java: %JAVA_HOME%\jre\bin\awt.dll .

Para acceder a este icono simplemente utiliza algún editor de DLLs o algún programa extractor de iconos.


Nota: a la hora de trabajar con recursos utilizando métodos como getResource(String name) debemos de utilizar siempre el separador “/“. Evitar usar File.separator o File.separatorChar para este caso.

Documentación:
* Java™ Platform, Standard Edition 6 API Specification


, , , , , ,

  1. #1 por Leonardo el diciembre 9, 2011 - 6:51 pm

    Excelente info, gracias.

  2. #3 por @diazespina el agosto 9, 2012 - 5:32 am

    Genio!!! me anduvo de una!!!

  3. #4 por Jhan Castillo Tuesta el marzo 13, 2013 - 9:32 pm

    Cabe Resaltar que para poder colocarle un Icono a un JInternalFrame es necesario que dentro de la Propiedad frameIcon escojas la Imagen y que la Imagen sea del tamaño de 16×16 px para que la distorsión sea minúscula y que la imagen tenga como extensión .png para que sea mucho mejor la elección de la imagen.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: