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 !!!

0 comentarios:

Publicar un comentario en la entrada