viernes, 26 de octubre de 2007

Generar una sola instancia de un JFrame

Cuando hacemos programas con formularios windows y los llamamos desde un menu, cada vez que hacemos click sobre la opcion del menu nos creara un nuevo form, lo que deseaba es tener una sola instancia de cada formulario, sin usar el modo modal claro esta.

Encontre una forma.. usando el "Patrón Singleton", la verdad no lo entiendo muy iben pero como muchos de uds. solo queremos usarlo, y hacer rapidamnete nuestros programas; he aqui la forma:

1. Diseña tu formulario(jframe, jdialog, jinternalframe, etc) en el IDE Netbeans.

2. Cambia en el formulario la propiedad "defaultCloseOperation" a HIDE

3. Agrega la propiedad "myInstance" a la clase de tu formulario, algo como:
private static myjFrame myInstance;

4. Agrega el metodo getinstance() al formulario, algo como:

public static myjFrame getInstance()
{
if (myInstance == null)
myInstance = new myjFrame();
return myInstance;
}

5 Para usar el formulario desde un menu:

private void jMenuItem2MousePressed(java.awt.event.MouseEvent evt)
{
myjFrame myForm = myjFrame.getInstance();
myForm.setVisible(true);
}

Espero les sirva.

2 comentarios:

  1. He estado trabajando mucho en este tema y resolvi como solución no capturar la instancia creo q lo mas efectivo es que al momento de crear la instancia nueva, desabilitar el boton o el item del menu con "setEnable(false);", y al momento de cerrar esa ventana enviar q este elemento se vuelva a habilitar "setEnable(true);".

    Ej:
    Clase a{


    //asumos q ya todo los componentes estan
    //inicializados y en funcionamiento

    private JMenuItem/JButton NombreBoton;

    //aqui es donde le doy la accion crear
    //la nueva instancia desde un evento

    private void nuevaVentanaXActionPerformed (java.awt.event.ActionEvent evt) {
    NombreBoton.setEnabled(false);//atencion
    b instanciaB = new b(NombreBoton);
    instanciaB.show();
    this.JDesktopPane.add(NombreBoton);
    }
    }

    Clase b{

    private JMenuItem/JButton NombreBoton;

    //Aqui solo inicializo un elemento para
    //luego enviarlo como parametro al constructor
    //de la instancia q voy a crear y solo
    //para decirle q cuando cierre la instancia
    //el componente se vuelva habilitar

    public b(JMenuItem/JButton instancia) {
    NombreBoton = instancia

    }
    private void botonCerrarNuevaInstancia ActionPerformed
    (java.awt.event.ActionEvent evt) {
    NombreBoton.setEnabled(true);
    this.dispose();
    }
    }

    //esto es solo explicativo no lo copien y lo peguen
    porque nunca les va a funcionar, solo entiendan la logica
    y se daran cuenta q es demasiado sencillo y practico

    ResponderEliminar
  2. gracias amigo andaba buscando esto.... la verdad pocas personas como tu se toman el tiempo de subir algo que pueda ayudar a los demás sigue así y gracias por tu tiempo

    ResponderEliminar