Не обновляется JLabel из второго потока - Java

Узнай цену своей работы

Формулировка задачи:

Учусь работать многопоточно. Создал второй поток с генератором тактов. На нем основал время работы программы. То-есть с задержкой в 1 секунду время на нее же увеличивается от нуля и далее. В кончоли все отлично при работе программы выводится. Теперь я решил на панель программы вывести, под кнопками, JLabel с индикацией этого времени. Лейбл встал, но надпись висит 0:0:0 и не обновляется. Я вставлял репейнты, менял объявление, определение строки и т.п. - единственное что я получил в консоли после запуска: Exception in thread "Второй Системный" java.lang.NullPointerException at init.TG.run(TG.java:22) at java.lang.Thread.run(Unknown Source) Вот коды класса с фреймом программы, интерфейсом, и класс с таймером во втором потоке:
Листинг программы
  1. public static JLabel oClock;
  2. public static String timeFromTG = "";
  3. public GraphicFramesModule()
  4. {
  5. setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  6. setPreferredSize(regdir.RegPage.mainWindowSize);
  7. setLayout(new BorderLayout());
  8. JPanel panelsOutputTexts = new JPanel();
  9. panelsOutputTexts.setLayout(new BorderLayout());
  10. JPanel buttonsBar = new JPanel();
  11. buttonsBar.setLayout(new GridLayout(15, 2, 10, 10));
  12. JButton button01 = new JButton("Сист.ком.");
  13. button01.setPreferredSize(new Dimension(150, 50));
  14. JButton button02 = new JButton("Консоль");
  15. button02.setPreferredSize(new Dimension(150, 50));
  16. JButton button03 = new JButton("Кнопка 03");
  17. button03.setPreferredSize(new Dimension(150, 50));
  18. JButton button04 = new JButton("Кнопка 04");
  19. button04.setPreferredSize(new Dimension(150, 50));
  20. JButton button05 = new JButton("Выход");
  21. button05.setPreferredSize(new Dimension(150, 50));
  22. oClock = new JLabel(timeFromTG);
  23. oClock.setPreferredSize(new Dimension(150, 50));
  24. buttonsBar.add(button01);
  25. buttonsBar.add(button02);
  26. buttonsBar.add(button03);
  27. buttonsBar.add(button04);
  28. buttonsBar.add(button05);
  29. buttonsBar.add(oClock);
  30. panelsOutputTexts.add(buttonsBar);
  31. add(panelsOutputTexts);
  32. setVisible(true);
  33. pack();
Листинг программы
  1. package init;
  2. public class TG implements Runnable
  3. {
  4. public void run()
  5. {
  6. int minTG = 0;
  7. int secTG = 0;
  8. int hourTG = 0;
  9. System.out.println("Второй поток создан и активен!");
  10. try
  11. {
  12. for (hourTG = 0; hourTG != 720; hourTG++) //часы в неделю
  13. {
  14. for (minTG = 0; minTG != 60; minTG++) //один час
  15. {
  16. for (secTG = 0; secTG != 60; secTG++) //одна минута
  17. {
  18. gfm.GraphicFramesModule.timeFromTG = (hourTG + ":" + minTG + ":" + secTG);
  19. gfm.GraphicFramesModule.oClock.repaint(); //ни черта не работает!!! "-_-
  20. Thread.sleep(1000);
  21. }
  22. }
  23. }
  24. gfm.GraphicFramesModule.tracingConsole("*** Программа работает больше недели!***\n***Лучше выполнить перезапуск!***");
  25. }
  26. catch (InterruptedException e)
  27. {
  28. System.out.println("Второй поток был прерван! Рестарт!");
  29. run();
  30. }
  31. System.out.println("Второй поток завершён!");
  32. }
  33. }

Решение задачи: «Не обновляется JLabel из второго потока»

textual
Листинг программы
  1. package init;
  2.  
  3. public class TG implements Runnable
  4. {  
  5.     public static String timeTemp = "";
  6.    
  7.     public void run()
  8.     {
  9.         int minTG = 0;
  10.         int secTG = 0;
  11.         int hourTG = 0;
  12.        
  13.         System.out.println("Второй поток создан и активен!");
  14.        
  15.         try
  16.         {
  17.             for (hourTG = 0; hourTG != 720; hourTG++) //часы в неделю
  18.             {
  19.                 for (minTG = 0; minTG != 60; minTG++) //один час
  20.                 {
  21.                     for (secTG = 0; secTG != 60; secTG++) //одна минута
  22.                     {
  23.                         gfm.GraphicFramesModule.timeFromTG = hourTG + ":" + minTG + ":" + secTG;
  24.                         timeTemp = hourTG + ":" + minTG + ":" + secTG;
  25.                         Thread.sleep(1000);
  26.                         gfm.GraphicFramesModule.oClock.setText(timeTemp);
  27.                     }
  28.                 }
  29.             }
  30.             gfm.GraphicFramesModule.tracingConsole("*** Программа работает больше недели!***\n***Лучше выполнить перезапуск!***");
  31.         }
  32.         catch (InterruptedException e)
  33.         {
  34.             System.out.println("Второй поток был прерван! Рестарт!");
  35.             run();
  36.         }
  37.        
  38.     System.out.println("Второй поток завершён!");
  39.     }
  40. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут