[Gvsig_desarrolladores] Atrapar cierre de una vista
Francisco José Peñarrubia
fpenarru en gmail.com
Mar Mar 25 16:08:52 CET 2008
Ok, entonces quizás se pueda probar algo de esto:
JFrame frame = (JFrame) PluginServices.getMainFrame();
Container cont = frame.getRootPane().getContentPane();
for (int i=0; i < cont.getComponentCount(); i++)
{
if (cont.getComponent(i) instanceof JDesktopPane)
{
JDesktopPane desktopPane = (JDesktopPane)
cont.getComponent(i);
JInternalFrame f = desktopPane.getSelectedFrame();
System.out.println(f.getTitle());
}
}
Aquí se asume que el MainFrame es un JFrame (espero que esto no cambie),
y que NewSkin usa internamente JDesktopPane (espero que tampoco cambie
esto, pero ya no pondría la mano en el fuego.... ;-)) . Y luego, se
utiliza instanceof para asegurarnos de que los objetos son los esperados.
En lugar de usar getSelectedFrame, se puede usar getAllFrames y recorrar
la lista, revisando el título de la ventana, etc.
Para los JDialog supongo que habría que usar algo como
getComponentsInLayer, pero yo no me metería por ahí. Supongo que en el
futuro, este caso de uso estará implementado en gvSIG, y así toda esta
parafernalia no será necesaria. ¿Quizás dando acceso directo a este
método del FrameWindowSupport? :
/**
* Gets the frame associated to the provided IWindow panel.
* The frame will usually be a JInternalFrame or a JDialog.
*
* @param panel The IWindow panel whose frame wants to be retrieved.
*
* @return The associated frame, it will usually be a JInternalFrame or
* a JDialog.
*/
public Component getFrame(IWindow panel) {
Object object = viewFrame.get(panel);
if (object!=null && object instanceof Component) {
return (Component) object;
}
else {
PluginServices.getLogger().error("window_not_found_"+panel.getWindowInfo().getTitle());
return null;
}
}
Saludos.
Fran.
César Martínez Izquierdo escribió:
> Francisco José Peñarrubia escribió:
>
>> Vereis, oficialmente, una ventana en gvSIG es un IWindow, un interfaz
>> de Andami. Pero el corePlugin lo que hace es asociar ese objeto (un
>> JPanel es lo que suele ser) a una ventana real, de las de Swing "de
>> toda la vida". La ventana que se crea y se rellena con el JPanel es
>> un JInternalFrame. No creo que eso cambie en un futuro cercano, así
>> que podemos suponer que la ventana es un JInternalFrame y usar sus
>> métodos.
>
> Ojo, esta asunción es un poco arriesgada. En el piloto 3D, por
> ejemplo, las vistas se muestran usando ventanas que no son
> JInternalFrames (son JDialogs).
>
>> Traducido (aunque no lo he probado):
>> - Recupera la ventana con
>> PluginServices.getMdiManager().getActiveWindow() o algún otro método.
>> - Haz un cast a un JInternalFrame.
>> - Crea un javax.swing.event.InternalFrameListener y añadelo al
>> JInternalFrame (addInternalFrameListener).
>>
>> Ya que la vista es una SingletonWindow, creo que solo existe una, y
>> se conservarán sus listeners entre apertura y apertura.
>
> Unos apuntes respecto a esto:
> El método getActiveWindow() te dará el JPanel (es decir, el IWindow)
> que está contenido en la ventana activa, no la ventana en sí. (Dicho
> de una forma, devuelve el contenido de la ventana, no la ventana en sí).
>
> Para llegar a la ventana, deberías hacerle un "cast" del IWindow a
> JPanel, y usar el método getParent repetidamente hasta llegar al
> JInternalFrame o al JDialog. En ese momento sí podríamos hacer un cast
> y añadir el listener.
>
> Pero reitero que esto es un método "poco seguro", porque de esta forma
> te estás saltando las interfaces y asumes una implementación concreta
> (que ya ha cambiado y puede volver a cambiar).
> Si optas por esta técnica, te recomiendo que al menos pruebes con
> varios tipos de ventana (JDialog, JInternalFrame, JFrame, JWindow...)
> para ver qué cast se puede realizar. Si te basta con que funcione en
> versiones actuales de gvSIG, puedes simplemente probar con
> JInternalFrame y JDialog.
>
> Saludos,
>
>
>> Bueno, nada más. Espero que te sirva.
>>
>> Saludos.
>>
>> Fran.
>
>
>
Más información sobre la lista de distribución gvSIG_desarrolladores