Minimizar aplicación Java al TrayBar

Bueno, para empezar este es un tema que comencé a buscar por cuestiones de trabajo (bueno, es un proyecto que traemos un primo y yo).
Y no encontraba la manera de que mi aplicación se escondiera en el TrayBar (bandeja del sistema, área de notificación, o como le quieran llamar.

Esa es el área de notificación o traybar
Esa es el área de notificación o traybar

En fin…es un programa muy sencillo.

Lo que necesitamos:

  • Nuestro programa (obviamente con un frame o jframe), para este ejemplo se utilizan las librerías javax.swing (el diseño) y los eventos se manejan con java.awt.

Luego, no voy en contra de usar un IDE u otro, usen el que más les guste. En mi caso yo usé Gedit (no es un IDE, de hecho es como el bloc de notas pero este si distingue las clases y tipos de variables del código común  jejeje).

Una vez listos comencemos. Todo comienza en nuestro método main, hay que declarar un runnable:

public static void main(String [] args){

Runnable correr = new Runnable(){};

}

Como se puede ver hay estan las “{};” después de “new Runnable()”, esto es porque dentro pondremos el comportamiento de dicho objeto Runnable. Y obviamente todas las indicaciones siguientes se irán agregando en el método “run()” de nuestro objeto runnable a no ser que se indique lo contrario.

Luego después de haber declarado nuestro runnable es hora de comenzar con el comportamiento, primero hay que saber si el sistema actual (si, el sistema operativo) soporta áreas de notificaciones o traybar compatibles con nuestro JRE, eso lo realizamos de la siguiente forma:

if(java.awt.SystemTray.isSupported())

Es bueno poner un “else”, para que en caso de que nuestro sistema no soporte ningún traybar entonces que nos lo índique, aunque eso es opcional.

Después de comprobar si es soporta (asumiendo que si es soportado) tendremos que declarar “la configuración” de nuestra área de notificación, eso lo podemos hacer con el uso de las siguientes clases:

  • java.awt.SystemTray.-Con la que se definirán los parámetros de la traybar del sistema.
  • java.awt.Image.- Es la imagen que llevará en el área de notificación (opcional, si no le ponen nada sale un icono blanco. Esta imagen se le asigna a nuestro TrayIcon).
  • java.awt.PopupMenu.- Este es el menú del traybar en donde se contendrán las opciones de Cerrar, Restaurar, etc…
  • java.awt.TrayIcon.- Este es el icono que irá en el tray bar.
  • java.awt.MenuItem.- Son las opciones del menú, es decir, 1 MenuItem puede ser encargado de restaurar la aplicación, otro MenuItem encargado de cerrarla, etc…Pueden haber tantos MenuItem como lo necesiten.

Bueno si se ve muy bien, pero ¿cómo se usan estas clases?, obviamente debemos crear objetos de cada clase:

final java.awt.SystemTray sTray =  java.awt.SystemTray.getSystemTray();
java.awt.Image img = java.awt.Toolkit.getDefaultToolkit().getImage(“icono.jpg”); /*Esta imagen es la que aparecerá en el área de notificación, pueden elegir la ruta que deseen, yo puse una imagen en la carpeta raíz del proyecto y es por eso que utilizo el Toolkit, pero pueden usar la ruta que mejor les convenga.*/
java.awt.PopupMenu pMenu = new java.awt.PopupMenu();
final java.awt.TrayIcon tIcon  = new java.awt.TrayIcon(img, “mi texto”, pmenu); /*aquí se le asigna el menú que va a salir cuando uno de click derecho en el icono que aparecerá en el área de notificación y el texto que saldrá al posicionar el puntero del ratón (mouse) en el icono.*/

/*Luego hay que agregar los elementos del menú, es decir, cerrar, restaurar, etc…En este ejemplo solo se agregarán restaurar y cerrar.*/
java.awt.MenuItem mitRestaura = new java.awt.MenuItem(“Restaurar”);
mitRestaura.addActionListener(new java.awt.event.ActionListener(){
/*————-*/public void actionPerformed(java.awt.event.ActionEvent ev){
/*———————*/miFrame.setVisible(true);
/*————-*/}
});
pMenu.add(mitRestaura);
java.awt.MenuItem mitCierra = new java.awt.MenuItem(“Cerrar”);
mitCierra.addActionListener(new java.awt.event.ActionListener(){
/*————-*/public void actionPerformed(java.awt.event.ActionEvent ev){
/*———————*/System.exit(0);
/*————-*/}
});
pMenu.add(mitCierra);
/*Ahora hay que agregar nuestro objeto tIcon al área de notificación de nuestro sistema*/
try{
/*—*/sTray.add(tIcon);
}catch(Exception e){
/*—*/javax.swing.JOptionPane.showMessageDialog(“Hubo un problema: \n”+e.getMessage +”\n” + e.StackTrace());
}

Para finalizar, ya fuera de la definición de nuestro método run (de nuestro objeto correr) y fuera de la definición de nuestro objeto correr, debemos agregar nuestro objeto correr a la cola de eventos:

java.awt.EventQueue.invokeLater(correr);

Esta es la única solución que encontré y que me funcionó.

Pueden probar esta otra, que a mi no me funcionó, quizás porque el editor la hizo con netbeans y por lo cual puede ser una solución para netbeans y no para java en general (el mío está funcionando desde Gedit y Eclipse Galileo ó Ganymede.)

Anuncios

11 comentarios en “Minimizar aplicación Java al TrayBar

    1. ummestesimon dijo:

      De nada, si tienes más dudas sobre java o te interesaría algún tema puedes pedirlo.

      Gracias por la visita y saludos!

      1. Myon dijo:

        Muy bueno, ya que estamos pues me gustaria saber sobre como hacer ProgressBar o barra de progreso en Java, leyendo datos desde una base de datos. Gracias.

  1. erik dijo:

    Agregaría lo siguiente:

    img = java.awt.Toolkit.getDefaultToolkit().getImage(SysTray.class.getResource(“homer.gif”));

    1. ummestesimon dijo:

      No entiendo, ¿me podrías decir qué beneficios podría traer?, ya viendo los beneficios podría mejorar el post y hacer un aporte más rico.

      Gracias por tu comentario, espero tu respuesta.

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