Не обновляется 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)
Вот коды класса с фреймом программы, интерфейсом, и класс с таймером во втором потоке:
public static JLabel oClock; public static String timeFromTG = ""; public GraphicFramesModule() { setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setPreferredSize(regdir.RegPage.mainWindowSize); setLayout(new BorderLayout()); JPanel panelsOutputTexts = new JPanel(); panelsOutputTexts.setLayout(new BorderLayout()); JPanel buttonsBar = new JPanel(); buttonsBar.setLayout(new GridLayout(15, 2, 10, 10)); JButton button01 = new JButton("Сист.ком."); button01.setPreferredSize(new Dimension(150, 50)); JButton button02 = new JButton("Консоль"); button02.setPreferredSize(new Dimension(150, 50)); JButton button03 = new JButton("Кнопка 03"); button03.setPreferredSize(new Dimension(150, 50)); JButton button04 = new JButton("Кнопка 04"); button04.setPreferredSize(new Dimension(150, 50)); JButton button05 = new JButton("Выход"); button05.setPreferredSize(new Dimension(150, 50)); oClock = new JLabel(timeFromTG); oClock.setPreferredSize(new Dimension(150, 50)); buttonsBar.add(button01); buttonsBar.add(button02); buttonsBar.add(button03); buttonsBar.add(button04); buttonsBar.add(button05); buttonsBar.add(oClock); panelsOutputTexts.add(buttonsBar); add(panelsOutputTexts); setVisible(true); pack();
package init; public class TG implements Runnable { public void run() { int minTG = 0; int secTG = 0; int hourTG = 0; System.out.println("Второй поток создан и активен!"); try { for (hourTG = 0; hourTG != 720; hourTG++) //часы в неделю { for (minTG = 0; minTG != 60; minTG++) //один час { for (secTG = 0; secTG != 60; secTG++) //одна минута { gfm.GraphicFramesModule.timeFromTG = (hourTG + ":" + minTG + ":" + secTG); gfm.GraphicFramesModule.oClock.repaint(); //ни черта не работает!!! "-_- Thread.sleep(1000); } } } gfm.GraphicFramesModule.tracingConsole("*** Программа работает больше недели!***\n***Лучше выполнить перезапуск!***"); } catch (InterruptedException e) { System.out.println("Второй поток был прерван! Рестарт!"); run(); } System.out.println("Второй поток завершён!"); } }
Решение задачи: «Не обновляется JLabel из второго потока»
textual
Листинг программы
package init; public class TG implements Runnable { public static String timeTemp = ""; public void run() { int minTG = 0; int secTG = 0; int hourTG = 0; System.out.println("Второй поток создан и активен!"); try { for (hourTG = 0; hourTG != 720; hourTG++) //часы в неделю { for (minTG = 0; minTG != 60; minTG++) //один час { for (secTG = 0; secTG != 60; secTG++) //одна минута { gfm.GraphicFramesModule.timeFromTG = hourTG + ":" + minTG + ":" + secTG; timeTemp = hourTG + ":" + minTG + ":" + secTG; Thread.sleep(1000); gfm.GraphicFramesModule.oClock.setText(timeTemp); } } } gfm.GraphicFramesModule.tracingConsole("*** Программа работает больше недели!***\n***Лучше выполнить перезапуск!***"); } catch (InterruptedException e) { System.out.println("Второй поток был прерван! Рестарт!"); run(); } System.out.println("Второй поток завершён!"); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д