es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

JFrame mantiene la aplicación ejecutándose incluso después de cerrarla.

Tengo una clase con solo métodos estáticos y uno de ellos abre un diálogo de mensaje de error de JOptionPane utilizando un objeto JFrame como componente.

Esta es la clase + método:

public class miscMethods
{
    static JFrame errorWindow = null;

    public static void ErrorPopup(String message)
    {
        errorWindow = new JFrame();
        errorWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        errorWindow.setAlwaysOnTop(true);
        JOptionPane.showMessageDialog(errorWindow, message, "Error", JOptionPane.ERROR_MESSAGE);
        errorWindow = null;
    }
}

El método ErrorPopup se utiliza dentro de un controlador de JavaFX y otros lugares, se llama así:

import static code.miscMethods.ErrorPopup;
...
ErrorPopup("Este es el mensaje de error");

El problema es que el proceso de la aplicación no se cerrará cuando cierre el programa desde la ✕ de la ventana después de que aparezca el mensaje emergente, porque se creó y mostró el JFrame.
Sé que el JFrame es el culpable, así que agregué errorWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pero no parece hacer nada, ya que el programa no se cierra.

En esta pregunta:
La respuesta aceptada habla sobre hilos no demonio, pero el único hilo que abro es uno demonio, así que a menos que JavaFX abra uno, no puede ser eso creo.

Entonces, ¿por qué el proceso sigue en ejecución y cómo puedo solucionarlo?

Sigo siendo nuevo en Java, así que si cometí un error y/o mi código muestra malas prácticas, ¡por favor señálenlas!

Editar: Estoy usando un JFrame porque necesito el setAlwaysOnTop, ya que usar
JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE); lo abre no encima de la ventana de JavaFX. Si hay una mejor manera, avísenme.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el objeto JFrame no se está eliminando correctamente cuando se cierra el cuadro de diálogo de mensaje de error. Es por esto que el proceso de la aplicación continúa ejecutándose incluso después de que se cierre la ventana del programa.

    Para resolver este problema, puedes agregar un WindowAdapter al objeto JFrame y utilizar el método windowClosed() para eliminar correctamente el marco. Aquí tienes un fragmento de código actualizado:

    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    public class MiscMethods {
        static JFrame errorWindow = null;
    
        public static void errorPopup(String message) {
            errorWindow = new JFrame();
            errorWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            errorWindow.setAlwaysOnTop(true);
            errorWindow.addWindowListener(new WindowAdapter() {
                public void windowClosed(WindowEvent e) {
                    errorWindow.dispose();
                }
            });
            JOptionPane.showMessageDialog(errorWindow, message, "Error", JOptionPane.ERROR_MESSAGE);
            errorWindow = null;
        }
    }
    

    En el código actualizado, se ha establecido defaultCloseOperation del JFrame en DO_NOTHING_ON_CLOSE. Esto se debe a que queremos manejar el evento de cierre de la ventana nosotros mismos utilizando el WindowAdapter.

    Se ha agregado el WindowAdapter al objeto JFrame y se ha anulado el método windowClosed() para eliminar correctamente el objeto JFrame.

    Con esto, el proceso de la aplicación debería cerrarse correctamente cuando se cierra la ventana del programa después de que aparezca el cuadro de diálogo de mensaje de error.

Comments are closed.