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

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


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

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

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