@educasitas

miércoles, 27 de enero de 2010

Java: Popups desde el System Tray

Hace unos meses, empezó a rondar sobre mi un curioso proyectito para hacer en el curro. El tema era relativamente novedoso para mí, se trataba de una aplicación de escritorio (aplicaciones de escritorio a mí que sólo sé hacer aplicaciones Web).

La aplicación internamente era llamada "Widget" y consistía en una aplicación que se ejecutaría en el tray de Windows y mostraría mensajes de avisos cuando pasarán determinadas cosas (eventos de CCOW pero esta ya es un tema aparte), vamos, necesitaba algo parecido a los popups que aparecen cuando se conecta alguien a un programa de mensajería o se recibe un correo.

Ante mi inexperiencia en el tema (y mis ganas de hacerlo en Java) me pasé por JavaHispano esperando que algún guru iluminase mi camino, pero no obtuve ninguna respuesta.

Así que, después de mucho investigar descubrí Growl for Windows, y con suerte para mí disponía de un API para comunicarse utilizarlo desde Java (libgrowl). Así que al final, después de una larga búsqueda fuí capaz de generar algo relativamente curioso.


A parte de utilizar la librería, gracias a las bondades del mundo open source le realicé unas modificaciones para añadir soporte simple a "callbacks". Con mis cambios ahora, puedo configurar que al hacer clic sobre el popup se abre una determinada URL en el navegador predeterminado. Estoy intentando ponerme en contacto con el responsable de la librería para añadirlo, ya que a pesar de ser una cosa simple le otorga gran versatilidad a los popups.

Aquí van un mini ejemplo de uso


public class WidgetTrayApp
{

TrayIcon trayIcon = null;

// Conexion con GROWL 4 Windows
GrowlConnector growl = new GrowlConnector("localhost");

// Creamos la aplicación
Application widgetHSAL = new Application("Widget HSAL", "http://localhost:8080/message_generator/img/barrilete.png");

// Tipos de notifaciones
NotificationType widgetStarted = new NotificationType("Widget iniciado");
NotificationType widgetFinished = new NotificationType("Widget finalizado");
NotificationType widgetInfo = new NotificationType("Información encontrada");

public WidgetTrayApp()
{

// Si existe tray generamos un icono en el tray que será nuestra
// aplicación
if (SystemTray.isSupported())
{
SystemTray tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().getImage("barrilete.gif");

// Registramos las notificaciones de nuestra aplicación
NotificationType[] notificationTypes = new NotificationType[] { widgetStarted, widgetFinished, widgetInfo };
growl.register(widgetHSAL, notificationTypes);

ActionListener exitListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// Notificacion de salida de la aplicación
Notification stopWidgetNotification = new Notification(widgetHSAL, widgetFinished, "¡Hasta la próxima!", "");
growl.notify(stopWidgetNotification);
System.exit(0);
}
};

PopupMenu popup = new PopupMenu();

MenuItem exitItem = new MenuItem("Salir");
exitItem.addActionListener(exitListener);
popup.add(exitItem);

trayIcon = new TrayIcon(image, "Widget Tray App", popup);

trayIcon.setImageAutoSize(true);

try
{
tray.add(trayIcon);
} catch (AWTException e)
{
System.err.println("TrayIcon could not be added.");
}

// Notificación de inicio de aplicación
Notification startWidgetNotification = new Notification(widgetHSAL, widgetStarted, "¡Bienvenido!",
"¡Soy el Widget de Historia de Salud y estoy aquí para ayudarte! Cada vez que tenga información interesante te la mostraré");
growl.notify(startWidgetNotification);

} else
{
System.err.println("System tray is currently not supported.");
}
}


¿Y vosotros? ¿Alguna vez os habéis encontrado con una problemática similar? ¿Cómo la resolvistéis?

3 comentarios:

  1. Hola.

    Me ha gustado muchísimo tu proyecto. Estoy buscando algo parecido pero soy un newbie en Java y tengo algunas dificultades.
    Me he bajado tu ejemplo pero no cnosigo hacerlo ejecutar bien.. (No tiene errores pero al ejecutarlo no me funciona)
    Si me puedieras decir cómo hacerlo funcionar te lo agradecería.

    ResponderEliminar
  2. Lo que hay que hacer es:
    1) Bajarse e instalar Growl for Windows [http://www.growlforwindows.com/gfw/]
    2) Añadir al classpath el jar con el API para utilizar Growl desde Java [http://sourceforge.net/projects/libgrowl/]
    3) Compilar/Ejecutar usando Java 6

    ResponderEliminar
  3. Gracias!
    Me faltaba instalar Grwol for windows, pensaba que no era necesario.

    Un saludo!

    ResponderEliminar