Не обновляется 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("Второй поток завершён!");
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д