¿Por qué InvokeLater hace que mi JFrame no se muestre correctamente?

Ok, he leído una búsqueda en toda la web, y todavía no he encontrado la solución a mi problema, tal vez me esté perdiendo algo simple, por lo tanto, aquí estoy ...

Tengo un proyecto bastante grande, que maneja órdenes de trabajo para un negocio de reparación. Es toda la base de datos conectada, muchas páginas de código y clases. Pero acabo de agregar un pequeño fragmento de código a la interfaz que esencialmente busca nuevos mensajes en nuestra área de notas.

De todos modos, muestro un sencilloJFrame con dosJLabels mientras que un hilo separado consulta la base de datos. Todo esto sucede al inicio del programa. El problema es mi pequeño "por favor espera"JFrame viene con su marco pero sin agallas, sin fondo, y sinJLabels, durante la espera (que es el resto del programa que se está cargando, no el subproceso de la base de datos), las palabras clave que muestra, pero para ese entonces falta su punto.

Escribí el siguiente programa de ejemplo. Muestra un simpleJFrame (CheckingMessagesGUI: aJFrame con dosJLabels, nada más) duerme durante 5 segundos y luego muestra el Ejemplo (programa principal)JFrame, luego se cierra al instante (System.exit(0)) en este ejemplo, por supuesto, mi programa real va a hacer mucho más. Lo que encontré es queinvokeLater Parece estar causando el problema. Una vez que el temporizador de espera se agote, se mostrará la ventana, pero el código para mostrarlo se dio antes deThread.sleep comando, y se debería haber hecho en ese orden correcto?

Mi pregunta es ¿por quéinvokeLater causa miJFrame no se muestra correctamente?

Es mi entendimiento que el propósito deinvokeLater es para que los elementos se ejecuten en el hilo del evento AWT correcto, lo que me haría pensar que esta ventana se pintaría correctamente. De todos modos estoy seguro que me falta algo obvio. Comenté elinvokeLater parte en el código a continuación, y se ejecuta correctamente, si lo pones de nuevo no lo hace ...

Muchas gracias de antemano.

package javaapplication6;

public class Example extends javax.swing.JFrame {          
    public Example() {
        System.out.println("Example started");
        setBounds(100,100,200,200);

        System.out.println("cmGUI instantiated");
        CheckingMessagesGUI cmGUI = new CheckingMessagesGUI();
        System.out.println("Set cmGUI visible");
        cmGUI.setVisible(true);
        cmGUI.validate();
        try {
            System.out.println("timer started");
            Thread.sleep(5000);
            System.out.println("timer done");
        } catch(InterruptedException e){
        }
        System.exit(0);
    }

    public static void main(String[] args) {
        /*java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() { */
        System.out.println("Started");
        System.out.println("example Instantiated");
        Example example = new Example();
        System.out.println("example visible");
        example.setVisible(true);
        /*      }
        });
        */
    }
}

ACTUALIZACIÓN: Para aclarar, me doy cuenta.Thread.sleep() bloqueará todo, pero ¿no debería haber sido extraído mi CheckingMessagesGUI antes de llamar al modo de suspensión? Ese es el problema.

Respuestas a la pregunta(4)

Su respuesta a la pregunta