Poner un jFrame como modal en Java

Los jDialog en Java ya vienen con la propiedad de setModal() por defecto, esto permite que el formulario siempre quede en primer plano hasta que uno decida cerrarlo o abrir otro formulario encima de este.

Para los que ya trabjan con jDialog eso no es ninguna novedad. Pero en este articulo lo que les quiero mostrar es Cómo podemos asignarle una propiedad setModal() a un jFrame en Java.

Sabiendo que los jFrame no soporta el setModal(), existe una forma de hacer que un jFrame quede como modal y aparezca siempre en el primer plano de nuestra aplicación.

La forma de hacerlo es muy simples. La siguiente linea nos muestra cómo podemos lograr.

       jFrame f = new jFrame();
       f.setAlwaysOnTop(true); //Esto nos permite que el jFrame sea un modal
       f.setVisible(true);

Eso es todo, bien simples. Espero que les haya sido de utilidad

8 comentarios en “Poner un jFrame como modal en Java”

  1. mmmm alwaysonTop nop, no sirve…. porque no tiene la funcionalidad principal de un objeto modal: bloquear todos los objetos del frame «padre». Hay que buscar por otro lado. 🙁

  2. this.setAlwaysOnTop(true); Funciona de forma que el JFrame queda en primer plano, Puede servir para implementarlo en algún splashscreen temporal, para que este encíma del formulario Padre.

  3. setAlwaysOnTop no evita que cambies el focus a la ventana de abajo y sigas trabjando con ella aun cuando la ventana «modal» sigue abierta.

  4. A lo mejor es un poco tarde xD, pero a mi me funciona usar un JDialog y usar el metodo miJDialog.setModal(true);

    Si antes era un JFrame lo que tienes que hacer en codigo es cambiar el extends JFrame por JDialog y en el editor grafico en propiedades del JDialog cambiar el defaultCloseOperation por «Dispose».

    Saludos

  5. Donde diga:
    public class RegistrarEmpleado extends JFrame {

    cambialo por:
    public class RegistrarEmpleado extends JDialog {

    Listo 😀

  6. Hola! El caso que yo tengo es que al usar JDialog este funciona sin problema alguno como modal, pero no aparece los botones de Minimizar y Maximizar de la ventana. Como si necesito estos dos botones, entonces hice uso de un JFrame al cual modifico el constructor para que reciba otra JFrame padre, creo una variable parent para almacenar esta referencia. Y me encargo de deshailitar al padre cada que la venta de mi Frame hijo este activa y de habilitar nuevamente al padre cada que lo cierro. Para esto uso los eventos del Frame hijo WindowOpened y WindowClosed. En este ultimo es necesario llamar también a setVisible(true) del JFrame padre ya que se minimiza de lo contrario. En código queda así:

    public class JFChild extends javax.swing.JFrame {
    private final java.awt.Frame parent;

    public JFChild (java.awt.Frame parent) {
    initComponents();
    this.parent = parent;
    }

    private void formWindowOpened(java.awt.event.WindowEvent evt) {
    this.parent.setEnabled(false);
    //this.parent.setVisible(true); //Opcional si queremos ocultar a JFrame padre.
    }

    private void formWindowClosed(java.awt.event.WindowEvent evt) {
    this.parent.setEnabled(true);
    this.parent.setVisible(true);
    }
    }

  7. Hola!

    El caso que yo tengo es que al usar JDialog este funciona sin problema alguno como modal, pero no aparece los botones de Minimizar y Maximizar de la ventana. Como si necesito estos dos botones, entonces hice uso de un JFrame al cual modifico el constructor para que reciba otra JFrame padre, creo una variable parent para almacenar esta referencia. Y me encargo de deshailitar al padre cada que la venta de mi Frame hijo este activa y de habilitar nuevamente al padre cada que lo cierro. Para esto uso los eventos del Frame hijo WindowOpened y WindowClosed. En este ultimo es necesario llamar también a setVisible(true) del JFrame padre ya que se minimiza de lo contrario. En código queda así:

    public class JFChild extends javax.swing.JFrame {
    private final javax.swing.JFrame parent;

    public JFChild (javax.swing.JFrame parent) {
    initComponents();
    this.parent = parent;
    }

    private void formWindowOpened(java.awt.event.WindowEvent evt) {
    this.parent.setEnabled(false);
    //this.parent.setVisible(true); //Opcional si queremos ocultar a JFrame padre.
    }

    private void formWindowClosed(java.awt.event.WindowEvent evt) {
    this.parent.setEnabled(true);
    this.parent.setVisible(true);
    }

    }

Responder a Luis Higareda Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.