2014-02-08 3 views
1

Я выполнив следующий код:Java: Заявления не выполняется в порядке

lnum.setVisible(false); 
    Lsums.setVisible(false); 
    Ldigits.setVisible(false); 
    Lrows.setVisible(false); 
    L1.setVisible(false); 
    t1.setVisible(false); 
    t2.setVisible(false); 
    t3.setVisible(false); 
    Button.setVisible(false); 
    Done.setText("Done!"); 
    System.out.println("Done!"); 
    //setting everything invisible and printing Done on the screen 
    try { 
     Thread.sleep(5000); 
    } catch(InterruptedException ex) { 
     Thread.currentThread().interrupt(); 
    } 
    System.exit(0); 

Что должно произойти, по мне: «Готово» Done ярлык устанавливается в текст а затем println, за которым следует 5 секунд ожидания, а затем программа закрывается. Но что происходит; он делает println, а затем ждет 5 секунд, но никогда не устанавливает готовый ярлык Done! Почему?

Update 1 Примечание, если я просто удалить попытку сна и поймать блок, то он делает вещи, а затем отображает все сделано правильно, но не, если блоки сна присутствуют

Update 2 Почему это не первый выход, а затем спать? Зачем? [Как в ответах, они сказали, что это будет зависать, нормально, я получаю это, но если бы я написал, что он должен установить метку, он должен установить его, а затем сделать паузу после установки, почему раньше ???]

Если это так, все еще неясно: Посмотрите, что я хочу сделать, 1. сделайте некоторые предметы невидимыми. 2. измените текст ярлыка. 3. подождите 5 секунд. 4. автоматически выйдите. В этом точном порядке.

+0

'Done' является то, что здесь? показать нам полный код? –

+0

можно ли увидеть объект Done? – Esqarrouth

+3

В каком потоке вы выполняете этот код? Это EDT поток? – Taky

ответ

3

Вы спите в потоке отправки событий (EDT), вы замораживаете свой интерфейс, а Swing не может обновить подпись надписи. В этом случае вы просто изменили модель метки. Это означает, что в следующий раз качели будут использовать новое состояние модели (новый текст), когда будет краска. И когда вы замораживаете этот поток и выходите из приложения, вы не даете возможности перекрасить ярлык новым текстом.

EDT - специальная нить, где все компоненты рисуют на экране. Когда вы вызываете Thread#sleep(), вы блокируете EDT, и качели не могут перерисовать вашу метку. После завершения сна вы выходите из процесса, и Swing не может перерисовать новый текст.

Просто попробуйте удалить System.exit() вызов.

Если вы хотите выйти из своего приложения через 5 секунд после смены метки, вы можете развернуть System#exit() звонок в отдельной теме. Как и в любой среде с несколькими примерами, вы не можете ждать ровно 5 секунд, вы можете просто рекомендовать планировщику ОС выполнить действие примерно за 5 секунд. Это будет зависеть от загрузки процессора на CPU. Но в нормальном окр она должна имитировать некоторую паузу, когда метка изменилась

Рассмотрим следующий код (это не уровень производства, но должно работать):

new Thread(new Runnable() { //create new thread 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(5000); //wait here 
     } catch(InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
     System.exit(0); //kill Java process 
    } 
}).start(); //start new thread 
//EDT thread should continue executing 
+0

Не могли бы вы рассказать, как именно должен быть код? –

+0

Так как же мне выйти из моей программы?Я хочу, чтобы он вышел: P –

+0

@DakshShah, так что вы хотите изменить программное обеспечение пользовательского интерфейса и программную программу? – Taky

0
Done.setText("Done!"); 
    try { 
     Thread.sleep(5000); 
     System.out.println("Done!"); 
    } catch(InterruptedException ex) { 
     Thread.currentThread().interrupt(); 
    } 
    System.exit(0); 
+0

Это неправильно, все та же проблема –

Смежные вопросы