Почему 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()
заблокирует все, но не долженt Мои CheckingMessagesGUI уже полностью прорисованы, прежде чем я вызову sleep? Это проблема.