Por que o InvokeLater faz com que meu JFrame não seja exibido corretamente?

Ok eu li uma pesquisa em toda a web, e eu não encontrei a solução para o meu problema ainda, talvez eu esteja faltando algo simples, por isso aqui estou eu ...

Eu tenho um projeto bastante grande, que lida com ordens de serviço para um negócio de reparo. É tudo banco de dados conectado, muitas muitas páginas de código e classes. Mas acabei de adicionar um pequeno código ao front end que essencialmente verifica novas mensagens em nossa área de anotações.

Enfim, eu exibo um simplesJFrame com doisJLabels enquanto um thread separado consulta o banco de dados. Isso tudo acontece no início do programa. O problema é meu pequeno "por favor aguarde"JFrame vem com o seu quadro, mas sem coragem, sem fundo e semJLabels, durante a espera (que é o resto do carregamento do programa, não o encadeamento do banco de dados), depois ele é exibido, mas até lá não tem sentido.

Eu escrevi o seguinte programa de exemplo. Ele exibe um simplesJFrame (CheckingMessagesGUI: umJFrame com doisJLabels, nada mais) dorme por 5 segundos e exibe o Exemplo (programa principal)JFramefecha instantaneamenteSystem.exit(0)neste exemplo, é claro que meu programa real continua fazendo muito mais. O que eu encontrei é queinvokeLater parece estar causando o problema. Quando o temporizador se esgotar, a janela será exibida, mas o código para exibi-lo foi dado antes doThread.sleep comando, e deveria ter sido feito nessa ordem correta?

Minha pergunta é por queinvokeLater porque meuJFrame não exibir corretamente?

É meu entendimento que o propósito deinvokeLater é para que os itens sejam executados no encadeamento de eventos AWT correto, o que me faria pensar que essa janela seria pintada corretamente. De qualquer forma, tenho certeza de que estou sentindo falta de algo óbvio. Eu comentei oinvokeLater parte no código abaixo, e funciona corretamente, se você colocá-lo de volta não ...

Muito obrigado antecipadamente.

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);
        /*      }
        });
        */
    }
}

ATUALIZAÇÃO: Para esclarecer, eu perceboThread.sleep() irá bloquear tudo, mas o meu CheckingMessagesGUI não deve ter sido totalmente desenhado antes de chamar o sleep? Essa é a questão.