Как обновить текст у JLabel, когда переменная из другого класса изменяется?

У меня есть GUI class, в котором по клику на JButton pick_flower создается инстанс Pick_Flowers class, а по клику наJButton make_fuel создается инстанс Alchemy class. Я хочу, чтобы после одного клика на кнопку у одноименного JLabel менялся текст в соответствии со значением переменной сейчас. То есть ты один раз кликнул, а дальше текст меняется без твоего участия. Например, после 5 секунд значение переменной будет равно 3 (у JLabel-текста будет написано "3"), после 10 секунд значение будет равно уже 6 (у JLabel-текста будет написано "6") и так далее. Но в моем GUI текст JLabel не меняется (всегда "3" у счетчика цветов).

public class GUI extends JFrame {

public static void main(String args[]) {
    GUI g = new GUI();
}

public GUI() {
    JFrame frame = new JFrame("Worker");
    JPanel panel = new JPanel();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setVisible(true);
    panel.setLayout(null);
    frame.add(panel);

    JLabel flower_count = new JLabel("0 flowers");
    panel.add(flower_count);
    Dimension flower_count_size = flower_count.getPreferredSize();
    flower_count.setBounds(800, 125, 200, flower_count_size.height);

    JLabel fuel_count = new JLabel("0 fuel");
    panel.add(fuel_count);
    Dimension fuel_count_size = fuel_count.getPreferredSize();
    fuel_count.setBounds(800, 275, 200, fuel_count_size.height);

    JButton pick_flower = new JButton("Pick flowers");
    panel.add(pick_flower);
    pick_flower.setBounds(600, 110, 130, 60);

    pick_flower.addActionListener(v -> {
        Pick_Flowers pick_flowers = new Pick_Flowers();
        flower_count.setText(android_helper.sum(pick_flowers.flowers)) + " flowers picked");

    });

    JButton make_fuel = new JButton("Extract fuel");
    panel.add(make_fuel);
    make_fuel.setBounds(600, 250, 160, 60);

    make_fuel.addActionListener(mi -> {
        Alchemy alchemy = new Alchemy();
        fuel_count.setText(android_helper.sum(alchemy.fuel_tanks) + " fuel extracted");
    });

    frame.setVisible(true);
}

     } 

Здесь Pick_Flower class:

     import java.util.*;

     public class Pick_Flowers {

GirlsList girlsList = new GirlsList();
List<Integer> flowers = new ArrayList<>();
Android_Helper android_helper = new Android_Helper();

public static void main(String[] args) {

}

public Pick_Flowers(){
    Timer t = new Timer();
    t.schedule(new TimerTask() {
        @Override public void run() {
            flowerPicker();
        }
    }, 0, 5000);

}

public int flowerPicker() {
    int flower_picked = 1 * girlsList.flower_girls.size();
    flowers.add(flower_picked);
    System.out.println(android_helper.sum(flowers));
    return android_helper.sum(flowers);
}
      }

И Alchemy class

import java.util.*;

public class Alchemy{

GirlsList girlsList = new GirlsList();
List<Integer> fuel_tanks = new ArrayList<>();
Pick_Flowers w = new Pick_Flowers();
Android_Helper android_helper = new Android_Helper();

public static void main(String[] args) {

}

public Alchemy(){
    Timer t = new Timer();
    t.schedule(new TimerTask() {
        @Override public void run() {
           alchemyFuel();
        }
    }, 0, 15000);
}

public int alchemyFuel(){
    int flower_sum = android_helper.sum(w.flowers);
    System.out.println(flower_sum);
    int fuel = (flower_sum / girlsList.flower_girls.size()) * girlsList.alchemy_girls.size();
    fuel_tanks.add(fuel);
    int now_flowers = flower_sum - fuel;
    w.flowers = new ArrayList<>();
    w.flowers.add(now_flowers);
    return android_helper.sum(fuel_tanks);
} 
    }

Ответы (1 шт):

Автор решения: Дмитрий

Если я все верно понял, то попробуйте так:

import java.util.Timer;
import java.util.TimerTask;
import java.util.function.Supplier;
import javax.swing.JLabel;

public class TimerWrapper {
    
    private final long period;
    private final JLabel label;
    private boolean isActivated;
    
    public TimerWrapper(JLabel label, long period) {
        this.isActivated = false;
        this.label = label;
        this.period = period;
    }
    
    public void run(Supplier<Integer> supplier) {
        if (isActivated) return;
        isActivated = true;
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                label.setText(String.valueOf(supplier.get()));
            }
        }, 0, period);
    }
    
}


    import java.awt.Dimension;
    import javax.swing.*;
    
    public class GUI extends JFrame {
    
        private static final long serialVersionUID = -1267352938435573633L;
    
        public static void main(String args[]) {
            new GUI();
        }
    
        public GUI() {
            JFrame frame = new JFrame("Worker");
            JPanel panel = new JPanel();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            frame.setVisible(true);
            panel.setLayout(null);
            frame.add(panel);
    
            JLabel flower_count = new JLabel("0 flowers");
            panel.add(flower_count);
            Dimension flower_count_size = flower_count.getPreferredSize();
            flower_count.setBounds(800, 125, 200, flower_count_size.height);
    
            JLabel fuel_count = new JLabel("0 fuel");
            panel.add(fuel_count);
            Dimension fuel_count_size = fuel_count.getPreferredSize();
            fuel_count.setBounds(800, 275, 200, fuel_count_size.height);
    
            JButton pick_flower = new JButton("Pick flowers");
            panel.add(pick_flower);
            pick_flower.setBounds(600, 110, 130, 60);
    
            TimerWrapper pick_flowers = new TimerWrapper(flower_count, 5_000);
            
            pick_flower.addActionListener(v -> pick_flowers.run(()->flowerPicker()));
    
            JButton make_fuel = new JButton("Extract fuel");
            panel.add(make_fuel);
            make_fuel.setBounds(600, 250, 160, 60);
    
            TimerWrapper alchemy = new TimerWrapper(fuel_count, 15_000);
            make_fuel.addActionListener(mi -> alchemy.run(()->alchemyFuel()));
    
            frame.setVisible(true);
        }
        
        private int alchemyFuel() {
            //ваш код
            return 100;
        }
    
        private int flowerPicker() {
            //ваш код
            return 200;
        }
    
    }
→ Ссылка