Netbeans Platform LifecycleManager

domingo, 6 de junio de 2010
Una de las cosas que necesitamos cuando desarrollamos una aplicación es el control cuando cerramos la aplicación. Que debería hacer nuestra aplicación si presionamos el botón salir ? debemos guardar nuestro trabajo ? deberíamos confirmar la salida ? o simplemente debemos cerrar la aplicación y perder todo ?
Si han comenzado a utilizar la Netbeans Platform es posible que se hayan encontrado con este dilema, la solución es MUY simple.

Lo primero que debemos hacer es crear la carpeta META-INF/services en la raíz de la carpeta src de nuestro proyecto Netbeans. Dentro de esa carpeta creamos el archivo "org.openide.LifecycleManager", el cual es un simple archivo de texto (sin extensión txt ni nada), luego abrimos el archivio desde Netbeans y agregamos las siguientes líneas:
org.metalklesk.nbservices.impl.MyLifecycleManager
#position=1
org.netbeans.core.NbTopManager$NbLifecycleManager
#position=2

Con eso estamos indicando que reemplazaremos la implementación por default de Netbeans por la nuestra, así es como se ve:


luego simplemente debemos crear nuestra clase, la cual tiene el siguiente contenido:
public class MyLifecycleManager extends LifecycleManager {

@Override
public void saveAll() {
}

@Override
public void exit() {
//close all the topcomponent tabs
Set<TopComponent> tcs = TopComponent.getRegistry().getOpened();
Iterator<TopComponent> it = tcs.iterator();
while(it.hasNext()) {
TopComponent tc = it.next();
if(tc instanceof DepartmentEditorTopComponent)
tc.close();
}

Collection c = Lookup.getDefault().lookup (
new Lookup.Template (LifecycleManager.class)).allInstances();

for (Iterator i=c.iterator(); i.hasNext();) {
LifecycleManager lm = (LifecycleManager) i.next();
if (lm != this) {
lm.exit();
}
}
}

}

y así es como se ve:


Al extender de la clase LifecycleManager debemos implementar el método exit y es en esa implementación donde ingresamos nuestro código. En este caso me preocupo de cerrar unos TopComponent que yo construí.
El pedazo de código siguiente debe ir para poder cerrar la aplicación:
Collection c = Lookup.getDefault().lookup (
new Lookup.Template (LifecycleManager.class)).allInstances();

for (Iterator i=c.iterator(); i.hasNext();) {
LifecycleManager lm = (LifecycleManager) i.next();
if (lm != this) {
lm.exit();
}
}

Con eso ya tienen su propia implementación de la clase LifecycleManager y se pueden preocupar de realizar lo que sea necesario antes de cerrar la aplicación.

Saludos !!!

Netbeans Platform Notifications

martes, 1 de junio de 2010
He estado trabajando en un software para domótica (Home Automation) y para ello estoy utilizando la plataforma Netbeans y su excelente API.

Una de las cosas que me ha gustado es el manejo de las notificaciones.
Si han usado el IDE Netbeans, se habrán dado cuenta que cuando cargas algo, aparece un texto en el área de estado que está abajo a la izquierda (Status Area).

Para utilizar esa área para notificaciones desde tu aplicación simplemente basta con la siguiente linea de código:
StatusDisplayer.getDefault().setStatusText("Hola mundo");
así de simple.

También existe un globo, el cual muchos ya habrán visto cuando Netbeans encuentra actualizaciones. Ese globo también está disponible para tu aplicación!!!

Cómo se usa ? simple ... en el siguiente blog aparecen unas clases que amablemente su autor dispuso para todos en la red, las cuales yo estoy usando en mi aplicación con unas pequeñas modificaciones.

Las clases con mis modificaciones son las siguientes:

Con estas 3 clases en tu aplicación basada en Netbeans Platform, puedes usar el globo de la siguiente manera:
NotifyUtil.warn("titulo", "mensaje de advertencia", false);

NotifyUtil.show("titulo", "mensaje informativo", false);

NotifyUtil.show("titulo", "mensaje informativo", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//hago algo
}
};, false);

NotifyUtil.error("titulo", "mensaje de error, false);

NotifyUtil.error("titulo", "mensaje de error", exception, false);

El último muestra la excepción en un dialogo informativo.

Y por último si queremos mostrar una notificación en un diálogo informativo, en vez de usar un JOptionPane, podemos usar lo siguiente:
MessageUtil.showException("mensaje", exception);

MessageUtil.error("mensaje", exceptionInstance);

MessageUtil.error("mensaje");

MessageUtil.info("mensaje");

MessageUtil.question("mensaje");

MessageUtil.plain("mensaje");

Y con eso ya tenemos cubierto el tema de las notificaciones en la plataforma Netbeans.

Saludos !!!