2016-09-26 9 views
0

предыдущий тот же самый поток работал в java eclipse luna, но перерывы появились Я изменил на Java EE IDE, тот же поток, который ранее выполнялся в luna, теперь не работает в Java EE IDE, вот онНить в java не работает

public void clockTime(){ 
     Thread clock=new Thread(){ 
      public void run(){ 
       try { 
        for(;;){ 
         Calendar cald=new GregorianCalendar(); 
         day=cald.get(Calendar.DAY_OF_MONTH); 
         month=cald.get(Calendar.MONTH); 
         year=cald.get(Calendar.YEAR); 


         seconds=cald.get(Calendar.SECOND); 
         minutes=cald.get(Calendar.MINUTE); 
         hours=cald.get(Calendar.HOUR); 
         lblClock.setText("<html>"+hours+":"+minutes+":"+seconds+"<br>"+day+"/"+month+"/"+year+"</html>"); 
        sleep(1000); 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 
     clock.start(); 

     } 

, пожалуйста, кто-нибудь мне поможет. вызов метода конструктору, который я уже не видел здесь, но если я удаляю поток, метод выполняется, так как он отображает время и дату по мере необходимости, но не изменяется из-за отсутствия цикла и цикла forever.

+0

Ваш вопрос не понятен, вы должны изменить его, чтобы улучшить свой стиль и легкость его понимания. –

ответ

3

Если это свинг приложение затем:

  • Убедитесь, что вы запускаете приложение на потоке событий свинга, позвонив по телефону SwingUtilities.invokeLater(Runnable);, где начал свой GUI в этом Runnable
  • Вы делаете ключевой свинг-вызов выключен потока событий Swing (EDT) в коде выше, а именно: вызов lblClock.setText(...). Это также следует вызывать только в потоке событий Swing, так же, как указано выше.
  • Или вы можете использовать SwingWorker, а затем выполнить вызов setText в паре метода публикации/процесса.
  • Или (и это то, что я бы сделал), запустите весь этот код выше и используйте Swing Timer. Это намного проще, и вам не придется беспокоиться о событии Swing on/off, поскольку все вызовы будут в потоке событий.

Если вы отправляете маршрут таймера Swing Timer, вы должны построить проход в своем конструкторе, равный требуемой задержке, здесь 1000 мс. ActionListener Timer вызывается многократно, и вы получите свои значения времени, а затем используйте его для создания строки, которую вы передаете в JLabel.

Например, что-то примерно так:

int timerDelay = 1000; 
Timer timer = new Timer(timerDelay, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     // calculations to get time Strings 
     String text = ..... // use calculations above 
     lblClock.setText(text); 
    } 
}); 
timer.start(); 

Обратите внимание, что код не был протестирован

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