Как обновить текст у 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;
}
}