Warum wird mein JFrame durch InvokeLater nicht richtig angezeigt?

Ok, ich habe eine Suche im ganzen Web gelesen und noch keine Lösung für mein Problem gefunden. Vielleicht fehlt mir etwas Einfaches, daher bin ich hier ...

Ich habe ein ziemlich großes Projekt, das Arbeitsaufträge für ein Reparaturunternehmen bearbeitet. Es ist alles Datenbank verbunden, viele, viele Seiten Code und Klassen. Aber ich habe dem Frontend nur ein kleines Stück Code hinzugefügt, das im Wesentlichen nach neuen Nachrichten in unserem Notizbereich sucht.

Jedenfalls zeige ich eine einfacheJFrame mit zweiJLabels während ein separater Thread die Datenbank abfragt. Dies geschieht alles zu Beginn des Programms. Das Problem ist mein kleines "Bitte warten"JFrame kommt mit seinem Rahmen, aber keine Eingeweide, kein Hintergrund und neinJLabels zeigt während des Wartens (das ist der Rest des Programmladens, nicht der Datenbankthread) Nachwörter an, aber bis dahin fehlt sein Punkt.

Ich habe folgendes Beispielprogramm geschrieben. Es zeigt eine einfacheJFrame (CheckingMessagesGUI: aJFrame mit zweiJLabels, nichts mehr) schläft 5 Sekunden lang und zeigt dann das Beispiel (Hauptprogramm) anJFramewird sofort geschlossen (System.exit(0)) In diesem Beispiel macht mein echtes Programm natürlich noch viel mehr. Was ich gefunden habe, ist dasinvokeLater scheint das Problem zu verursachen. Sobald der Sleep-Timer abgelaufen ist, wird das Fenster angezeigt, der anzuzeigende Code wurde jedoch vor dem angezeigtThread.sleep Befehl, und sollte in dieser Reihenfolge richtig gemacht worden sein?

Meine Frage ist waruminvokeLater weil meinJFrame nicht richtig anzeigen?

Es ist mein Verständnis, dass der Zweck voninvokeLater ist so, dass die Elemente auf dem richtigen AWT-Ereignisthread ausgeführt werden, was mich glauben lässt, dass dieses Fenster korrekt gezeichnet wird. Jedenfalls bin ich mir sicher, dass ich etwas Offensichtliches verpasse. Ich habe das auskommentiertinvokeLater Teil in den Code unten, und es läuft korrekt, wenn Sie es zurücksetzen, tut es nicht ...

Vielen Dank im Voraus.

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

UPDATE: Um das zu klären, wird mir klarThread.sleep() wird alles blockieren, aber sollte meine CheckingMessagesGUI nicht bereits vollständig gezeichnet sein, bevor ich den Ruhezustand anrufe? Das ist das Problem.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage