jueves, 12 de junio de 2014

Abrir desde un jframe un jdialog modal que se cierre después de un tiempo


Abrir desde un jframe un jdialog modal que se cierre después de un tiempo

Proyecto descargable

En uno de mis proyectos que estaba desarrollando en java necesitaba enviar un mensaje a la pantalla, pero que después de un cierto tiempo el mensaje se cerrara sólo, al principio no sabía cómo hacerlo, de tal modo que busqué un poco de información en la web y encontré una manera de hacerlo usando la clase timer.

El problema se solucionó de la siguiente manera., fue elaborado en netbeans 8.0, en fedora gnome

/*el jframe principal contiene el siguiente código*/
public class menuInicial extends javax.swing.JFrame {

    /**
     * Creates new form menuInicial
     */
    public menuInicial() {
        initComponents();
    }
    private void jbAbrirDialogeActionPerformed(java.awt.event.ActionEvent evt) {
        new mensajeFelicitacion(this, rootPaneCheckingEnabled).setVisible(true);
    }                                            

    private void jbSalirActionPerformed(java.awt.event.ActionEvent evt) {                                      
        System.exit(0);
    }                                    

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new menuInicial().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                  
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JButton jbAbrirDialoge;
    private javax.swing.JButton jbSalir;
    // End of variables declaration                
}
El jframe principal contiene lo que se muestra en la imagen de arriba.
Las líneas que se agregan al código, son las que abren el diálogo y la del cerrar el programa
en el botón Abrir diálogo se agrega
 new mensajeFelicitacion(this, rootPaneCheckingEnabled).setVisible(true);

y en el botón salir se agrega:
System.exit(0);

En la interfaz dialog contiene
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

/**
 *
 * @author neo
 */
public class mensajeFelicitacion extends javax.swing.JDialog implements ActionListener{

    /**
     * Creates new form mensajeFelicitacion
     */
    public mensajeFelicitacion(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        Timer t = new Timer(10000, this);    // Timer in 10 seconds
        t.start();
        initComponents();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
         this.dispose();
     }

    // Variables declaration - do not modify                  
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration                
}

Lo importante aquí es que el jdialog implemente ActionListener, para que valide cuando el tiempo del timer ya haya transcurrido, es necesario sobre escribir el método.

En el constructor se inicializa el timer y se inicia.
 public mensajeFelicitacion(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        Timer t = new Timer(10000, this);    // Timer in 10 seconds
        t.start();
        initComponents();
    }
    @Override
en el escuchador se valida que el tiempo llegue a lo acordado, para que se destruya cuando sea necesario.
    public void actionPerformed(ActionEvent e) {
         this.dispose();
     }

Y eso es todo.



8 comentarios:

  1. Sé que no es muy acorde al tema pero tampoco es muy zafado de este, tengo una duda, ¿cómo hago para cerrar el JFrame que abre el JDialog?, digamos que es un botón (En el JDialog), para hacerlo fácil, que al darle clic se cierre el JDialog pero tambien se cierre el JFrame, esto para abrir otra ventana (JFrame) que no tiene nada que ver con el JFrame que anteriormente estaba abierto.

    Sé como abrir el otro JFrame desde el JDialog, pero no puedo cerrar el JFrame que abrio el JDialog, solo puedo cerrar el Jdialog y abrir el nuevo JFrame.

    Ayuda!! :(

    ResponderBorrar
    Respuestas
    1. Necesitas pasarle el objeto Jframe que abre el Dialog, y también el Jframe que necesitas abrir al cerrar el jframe que abre el dialog, luego al cerrar el dialog como dices, utilizar la opción dispose del jframe que abrió el jdialoge, finalmente haces visible el nuevo jframe que deseas abrir.

      Te entendería mucho mejor, si me mandaras un esketch del proceso que deseas hacer, un esquema, pues, y con gusto lo paso a código, para ver si es lo que necesitas...

      Borrar
  2. Muchas gracias por tu aporte, me fue de gran utilidad.

    ResponderBorrar
  3. Muchas gracias por tu aporte, me fue de gran utilidad.

    ResponderBorrar
  4. Te funciona? como puedes construir un Dialog y pasarle al contructor un objecto de tipo JFrame si esta esperando uno de tipo Frame del paquete AWT.?

    ResponderBorrar
    Respuestas
    1. Claro que sí, actualicé el proyecto, y ahora lo puedes descargar.
      Lo utilicé para un mini-video juego de aplasta zombies, pero usando un tablero enorme elaborado con arduino uno, ésta es sólo una parte de todo el proyecto, y quise compartirlo.

      Espero que te sea de utilidad.

      Borrar
  5. ufff que util espero me funcione el codigo. estoy aprendiendo java y me doy cuenta que hay cosas que parecen no tener coherencia por lo menos para mi, me tope con este problema de no saber como ejecutar una secuencia regresiva en una ventana (Modal), intente creandola dentro de un hilo pero parece que al ejecutar no permite hacer nada mas sino hasta que se cierra.

    ResponderBorrar