Хорошо, я прочитал поиск по всей сети, и я еще не нашел решение своей проблемы, возможно, я упускаю что-то простое, поэтому я здесь ...
У меня довольно большой проект, который обрабатывает заказы на работы для ремонтного бизнеса. Это все связано с базой данных, много-много страниц кода и классов. Но я только добавил небольшой фрагмент кода во внешний интерфейс, который по существу проверяет наличие новых сообщений в нашей области заметок.
В любом случае, я отображаю простой JFrame с двумя JLabel s, в то время как отдельный поток запрашивает базу данных. Все это происходит в начале программы. Проблема в том, что мое маленькое «пожалуйста, подождите» JFrame предлагает свой фрейм, но без кишок, без фона и без JLabel s во время ожидания (что является остальной частью программы загрузка, а не поток базы данных), послесловия, которые он отображает, но к тому времени он теряет свою точку.
Я написал следующий пример программы. Он отображает простой JFrame (CheckingMessagesGUI: JFrame с двумя JLabel s, больше ничего) в течение 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);
/* }
});
*/
}
}
UPDATE:
Чтобы уточнить, я понимаю, что Thread.sleep()
заблокирует все, но разве мой CheckingMessagesGUI не должен быть полностью прорисован до того, как я вызову sleep? Это проблема.