Не обновляется 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("Второй поток завершён!");
}
}