Dlaczego InvokeLater powoduje, że moja JFrame nie wyświetla się poprawnie?
Ok, przeczytałem przeszukanie w całej sieci, a nie znalazłem jeszcze rozwiązania mojego problemu, może brakuje mi czegoś prostego, stąd jestem ...
Mam dość duży projekt, który obsługuje zlecenia na prace naprawcze. To wszystko połączone z bazą danych, wiele stron kodu i klas. Ale właśnie dodałem krótki fragment kodu do frontonu, który zasadniczo sprawdza nowe wiadomości w naszym obszarze notatek.
W każdym razie pokazuję prostyJFrame z dwomaJLabels, podczas gdy osobny wątek odpytuje bazę danych. Wszystko to dzieje się na początku programu. Problemem jest mój mały „proszę czekać”JFrame pojawia się z ramką, ale nie ma odwagi, tła i nieJLabels, podczas oczekiwania (czyli pozostałej części ładowania programu, a nie wątku bazy danych), wyświetlane są słowa, ale wtedy brakuje jej punktu.
Napisałem następujący przykładowy program. Wyświetla prostyJFrame (Sprawdzanie wiadomościGUI: aJFrame z dwomaJLabels, nic więcej) śpi przez 5 sekund, a następnie wyświetla Przykład (program główny)JFrame, a następnie natychmiast zamyka się (System.exit(0)
) w tym przykładzie oczywiście mój prawdziwy program robi znacznie więcej. To co znalazłem to toinvokeLater
wydaje się być przyczyną problemu. Gdy skończy się czas uśpienia, wyświetli się okno, ale kod do wyświetlenia został podany przedThread.sleep
polecenie i powinno być wykonane w tej kolejności?
Moje pytanie brzmi: dlaczegoinvokeLater
bo mójJFrame nie wyświetlać poprawnie?
To moje zrozumienie, że celinvokeLater
jest tak, że elementy działają na poprawnym wątku zdarzenia AWT, co spowodowałoby, że pomyślałem, że to okno zostanie poprawnie pomalowane. W każdym razie jestem pewien, że brakuje mi czegoś oczywistego. SkomentowałeminvokeLater
w poniższym kodzie i działa poprawnie, jeśli go odłożysz, to nie ...
Z góry bardzo dziękuję.
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);
/* }
});
*/
}
}
AKTUALIZACJA: Aby wyjaśnić, zdaję sobie sprawęThread.sleep()
zablokuje wszystko, ale czy moje CheckingMessagesGUI nie zostały już w pełni narysowane, zanim zadzwonię do snu? To jest problem.