Почему InvokeLater заставляет мой JFrame отображаться неправильно?
Хорошо, я прочитал поиск по всей сети, и я еще не нашел решение своей проблемы, возможно, я упускаю что-то простое, поэтому вот я ...
У меня довольно большой проект, который обрабатывает рабочие заказы для ремонтного бизнеса. Это все связано с базой данных, много-много страниц кода и классов. Но я только добавил небольшой фрагмент кода во внешний интерфейс, который по существу проверяет наличие новых сообщений в нашей области заметок.
Во всяком случае, я показываю простойJFrame с двумяJLabels, пока отдельный поток запрашивает базу данных. Все это происходит в начале программы. Проблема моя маленькая "пожалуйста, подождите"JFrame приходит с рамкой, но без мужества, без фона и нетJLabels, во время ожидания (которое является остальной частью загрузки программы, а не потока базы данных), после слов, которые он отображает, но к тому времени он теряет свою точку.
Я написал следующий пример программы. Отображает простойJFrame (Проверка сообщенийGUI: aJFrame с двумяJLabels, ничего больше) спит в течение 5 секунд, затем отображает пример (основная программа)JFrameзатем мгновенно закрывается (System.exit(0)
) в этом примере, конечно, моя настоящая программа продолжает делать намного больше. Я обнаружил, чтоinvokeLater
кажется, вызывает проблему. Как только таймер отключения закончится, появится окно, но код для его отображения был дан передThread.sleep
команда, и должно было быть сделано в этом порядке правильно?
Мой вопрос почемуinvokeLater
потому что мойJFrame не правильно отображать?
Это мое понимание того, что цельinvokeLater
Это потому, что элементы работают в правильном потоке событий AWT, что заставляет меня думать, что это окно будет нарисовано правильно. В любом случае, я уверен, что упускаю что-то очевидное. Я закомментировалinvokeLater
часть в коде ниже, и он работает правильно, если вы положите его обратно, это не ...
Спасибо заранее.
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);
/* }
});
*/
}
}
ОБНОВЛЕНИЕ: чтобы уточнить, я понимаю,Thread.sleep()
будет блокировать все, но разве мой CheckingMessagesGUI не должен быть полностью прорисован до того, как я вызову sleep? Это проблема.