[Gvsig_desarrolladores] ¿Se pueden crear ventanas dentro de Andami del tipo JFrame?

Pablo Piqueras Bartolomé pablo.piqueras en iver.es
Mie Jul 16 14:42:45 CEST 2008


Dantón Ceballos escribió:
> Pablo Piqueras Bartolomé escribió:
>> Jorge Bellido Diez escribió:
>>> Hola a todos .. Cuando añado una ventana desde mi plugin utilizo la 
>>> instrucción PluginServices.getMDIManager().addWindow(panel); Estas 
>>> ventanas son del tipo JPanel en vez del tipo Jframe.
>>> Necesito controlar cuando se cierra mi ventana por lo que quería 
>>> deshabilitar el cierre automático al pulsar la X de la ventana. En 
>>> la web he visto que se puede usar la instrucción
>>> setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); 
>>> siempre que la clase sea del tipo Jframe
>>> ¿Se puede extrapolar esto a la clase Jpanel? ¿Se pueden crear 
>>> ventanas dentro de Andami del tipo JFrame?
>>>
>>>
>>> -----Mensaje original-----
>>> De: gvsig_desarrolladores-bounces en runas.cap.gva.es 
>>> [mailto:gvsig_desarrolladores-bounces en runas.cap.gva.es] En nombre de 
>>> Jorge Bellido Diez
>>> Enviado el: lunes, 07 de julio de 2008 13:07
>>> Para: Lista de Desarrolladores de gvSIG
>>> Asunto: RE: [Gvsig_desarrolladores] Cómo cancelar el cierre de mi 
>>> ventana en Andami
>>>
>>> Hola Victor,.. He redefinido mi clase añadiendo el interfaz 
>>> WindowListener e incorporo el método windowClossing. Me debo de 
>>> dejar algo porque no me responden estos método al ejecutar el 
>>> código. Me podrias pasar un breve ejemplillo..? Muchas gracias, Jorge
>>>
>>> public class VentanaInfoExpediente extends javax.swing.JPanel 
>>> implements SingletonWindow, IWindowListener, WindowListener  {
>>>
>>>
>>>     public void windowClosing(WindowEvent e) {
>>>         // TODO Auto-generated method stub
>>>         System.out.println("cerrannndo..");
>>>        
>>>     }
>>>
>>>  
>>>
>>>
>>>
>>> -----Mensaje original-----
>>> De: gvsig_desarrolladores-bounces en runas.cap.gva.es 
>>> [mailto:gvsig_desarrolladores-bounces en runas.cap.gva.es] En nombre de 
>>> Víctor Velarde Gutiérrez Enviado el: lunes, 07 de julio de 2008 12:28
>>> Para: 'Lista de Desarrolladores de gvSIG'
>>> Asunto: RE: [Gvsig_desarrolladores] Cómo cancelar el cierre de mi 
>>> ventana en Andami
>>>
>>> Hola,
>>>
>>> Prueba con el evento windowClosing...
>>>    
>>> Saludos,
>>>
>>> Víctor Velarde
>>>  
>>>  
>>>
>>> -----Mensaje original-----
>>> De: gvsig_desarrolladores-bounces en runas.cap.gva.es
>>> [mailto:gvsig_desarrolladores-bounces en runas.cap.gva.es] En nombre de 
>>> Jorge Bellido Diez Enviado el: lunes, 07 de julio de 2008 12:16
>>> Para: Lista de Desarrolladores de gvSIG
>>> Asunto: [Gvsig_desarrolladores] Cómo cancelar el cierre de mi 
>>> ventana en Andami
>>>
>>> Hola a todos.. tenia una duda sobre andami..
>>> tengo una ventana en la que edito unos valores alfanuméricos y 
>>> quisiera que al cerrarla me pregunte si deseo guardarlos.. he 
>>> definido mi clase de la siguiente manera:
>>>     public class VentanaInfoExpediente extends javax.swing.JPanel 
>>> implements SingletonWindow,IWindowListener { ...
>>>
>>> El caso es que en el método escribo el código a guardar pero,la 
>>> ventana siempre se cierra.
>>>
>>>     public void windowClosed() {
>>>
>>>         int n=0;
>>>
>>>         if (this.editando){
>>>             n = JOptionPane.showConfirmDialog( this,
>>>                         "¿Desea guardar los
>>> cambios?",
>>>                         "salir",
>>>     
>>> JOptionPane.YES_NO_CANCEL_OPTION);
>>>
>>>             this.setEditando(false,n);
>>>         }
>>>
>>>     if (n==2)         // cancelamos el cierre de la ventana
>>>         //.. Desconozco la orden..
>>>
>>> }
>>>
>>> ¿Cuál es la orden que tengo que utilizar para cancelar el cierre de 
>>> la ventana cuando ya estoy dentro del procedimiento windowClosed ?
>>>  
>>> Muchas gracias y un saludo;
>>> Jorge Bellido
>>>
>>>
>>> _______________________________________________
>>> gvSIG_desarrolladores mailing list
>>> gvSIG_desarrolladores en runas.cap.gva.es
>>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>>>
>>>
>>> _______________________________________________
>>> gvSIG_desarrolladores mailing list
>>> gvSIG_desarrolladores en runas.cap.gva.es
>>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>>>
>>> _______________________________________________
>>> gvSIG_desarrolladores mailing list
>>> gvSIG_desarrolladores en runas.cap.gva.es
>>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>>>
>>> _______________________________________________
>>> gvSIG_desarrolladores mailing list
>>> gvSIG_desarrolladores en runas.cap.gva.es
>>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>>>
>>>
>>>   
>> Hola Jorge,
>>
>> hay 2 tipos de "ventanas" (de tipo IWindow) que gestiona /_fwAndami 
>> /: JInternalFrame, y JDialog, ninguna de ambas es de tipo JFrame.
>>
>> En principio se podría tratar el "cierre de ventana" según la 
>> "naturaleza" Java de dichos componentes.
>>
>> Particularmente, una ventana puede tener implementado algún método 
>> para la notificación de cierre. El *modo más habitual (y formal en 
>> gvSIG) *es que un componente de tipo "IWindow", tambien implemente 
>> "IWindowListener", de _fwAndami.
>>
>> En este último caso, por ejemplo para el caso de un /JPanel/ que 
>> implementa IWindow, IWindowLister, ... puedes reimplementar el método 
>> /"public void windowClosed()"/, que se ejecutará una vez cerrada la 
>> ventana.
>>
>> Ten en cuenta que si heredas de alguna clase que implemente IWindow, 
>> esta ya puede tener lógica implementada para el cierre, y te interese 
>> utilizarla en vez de reemplazarla.
>>
>>
>> Espero haberte ayudado.
>>
>> Saludos.
>>
>> -- 
>> Pablo Piqueras Bartolomé
>>
>> Equipo de gvSIG
>> IVER T.I. S.A.
>> C/. Lérida, 20
>> 46005 - Valencia (Spain)
>> www.iver.es
>> www.gvsig.com
>>
>> Este mensaje y sus archivos son confidenciales. No está permitida su 
>> reproducción o distribución sin la autorización expresa de "IVER 
>> Tecnologías de la Información". Si usted no es el destinatario 
>> previsto, queda desautorizado cualquier uso, acceso o copia de este 
>> mensaje. Si ha recibido este mensaje por error, por favor bórrelo e 
>> infórmenos por esta misma vía.
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores en runas.cap.gva.es
>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>>   
> Hola Pablo.
> Es cierto que implementando el interfaz  IWindowListener se puede 
> escuchar el evento windowClosed y detectar cuando la ventana se ha 
> cerrado, pero no hay forma de evitar el cierre. Lo interesante sería 
> detectar que "se ha solicitado el cierre", realizar las acciones 
> pertinentes (validaciones, etc.) y poder cancelar ese cierre si se 
> considerase oportuno.
>
> Jorge: Yo soy un novato en esto pero creo que para usar el 
> setDefaultCloseOperation deberías acceder a la ventana subyacente al 
> IWindow de Andami (JInternalFrame o JDialog) y hacer con ella lo que 
> quieras: cambiarle la acción por defecto en el cierre, especificar 
> unas dimensiones mínimas, etc. Esto no es muy ortodoxo, pero creo que 
> funcionaría. Si existe algún otro modo... por favor, compartidlo.
>
> Saludos.
>
Hola,

he estado indagando más, y parece ser que no se tuvo en cuenta este caso.

Propongo una modificación para tu caso particular, siguiendo la 
implementación de Andami:

+ Interfaz IWindowListener :
  - Agregar método  "public void windowClosing();"
/*
*/+ Clase NewSkin :
  - Agregar método :
    private void callWindowClosing(IWindow window) {
        if (window instanceof IWindowListener) {
            ((IWindowListener) window).windowClosing();
        }
    }

  - Modificar método closeJDialog() :
    private void closeJDialog() {
        JDialog dlg = dss.popDialog();
        if (dlg==null)
            return;

        callWindowClosing(s);

        dlg.setVisible(false);

        IWindow s = (IWindow) fws.getWindow(dlg);

        callWindowClosed(s);

        fws.closeWindow(s);

        // Si es singleton se desasocia el modelo con la vista
        if (s instanceof SingletonWindow) {
            sws.closeWindow((SingletonWindow) s);
        }
    }

  - Modificar método closeJInternalFrame(JInternalFrame frame) :
private void closeJInternalFrame(JInternalFrame frame) {
        try {
            IWindow s = (IWindow) fws.getWindow(frame);

            callWindowClosing(s);
            frame.setClosed(true);
            callWindowClosed(s);
        } catch (PropertyVetoException e) {
            logger.error("Not compatible with property veto's. Use 
ViewInfo instead.",  e);
        }
    }

- Implementa el método "public void windowClosing()" con el código que 
deseas.






El tema de evitar que se cierre es más complejo, puede que la solución 
sencilla esté en que si lo que deseas es tener un comportamiento 
distinto al que Andami hace uso de las ventanas, que no utilices Andami, 
y trabajes directamente con JFrame o JDialog, como querías.


Es una propuesta no formal, que creo, para tu código sería útil.


Código fuente de la 1.1.2



Espero haberte ayudado.

Saludos.


-- 
Pablo Piqueras Bartolomé

Equipo de gvSIG
IVER T.I. S.A.
C/. Lérida, 20
46005 - Valencia (Spain)
www.iver.es
www.gvsig.com



Este mensaje y sus archivos son confidenciales. No está permitida su reproducción o distribución sin la autorización expresa de "IVER Tecnologías de la Información". Si usted no es el destinatario previsto, queda desautorizado cualquier uso, acceso o copia de este mensaje. Si ha recibido este mensaje por error, por favor bórrelo e infórmenos por esta misma vía.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://runas.cap.gva.es/pipermail/gvsig_desarrolladores/attachments/20080716/99fea2b1/attachment.htm


Más información sobre la lista de distribución gvSIG_desarrolladores