Как остановить\ запустить вывод элементов массива при помощи кнопки
Проблема: Я только начал знакомиться с GUI. Есть ui на swing, где реализовано несколько окон. В последнем окне есть поле(JLabel) в которое я передаю массив строк и с определенной задержкой все это печатаю(по очереди вывожу слова в это поле, удаляя предыдущее слово). Рядом с этой панелью хочу сделать кнопку JButton, при нажатии на которую вывод бы останавливался. При повторном нажатии, запускался бы. Не пойму сам алгоритм действия. Понимаю что скорее всего дело в многопоточности(с которой я пока что тоже на вы) Буду рад готовым решениям. Ниже приведу пример кода класса Printer, который и отвечает за вывод стрингов в лэйбл
package Core;
import javax.swing.*;
import java.util.ArrayList;
// Поток для обновления JLabel'а
public class Printer extends Thread {
private static final double minuteSize = 60000.0;
private ArrayList<String> array;
private JLabel textArray;
private double speed;
private volatile boolean isActive = true;
//TODO доработать расчет
private double smallWordsCoefficient = 1.1;
private double longWordsCoefficient = 0.9;
public Printer(ArrayList<String> s, JLabel textArray, long speed){
this.array = s;
this.textArray = textArray;
this.speed = minuteSize / speed;
}
@Override
public void run() {
synchronized (this) {
array.forEach(element -> {
if (isActiving()) {
Loader.getMainWindow().getShowPanel().getStartMenuButton().addActionListener(e -> {
// Если нажали возврат в главное меню, то прерываем вывод
isActive = false;
textArray.setText(null);
});
// Выводим слово
textArray.setText("" + element + "");
// Перерисовываем панель
textArray.repaint();
try {
// Стопорим изображение
if (element.trim().length() > 4) {
Thread.sleep((long) (speed * longWordsCoefficient));
} else {
Thread.sleep((long) (speed * smallWordsCoefficient));
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
textArray.setText(null);
});
// В конце текста выводим сообщение
textArray.setText("КОНЕЦ");
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
textArray.setText(null);
}
}
private boolean isActiving() {
return isActive;
}
public void stopPrinter() {
isActive = false;
}
}
вот место где этот код вызывается в окне
// Если пользователь ввел скорость чтения, то выводим слова на экран
speedText.addActionListener(e -> {
if (speedText.getText().length() < 6) {
speed = Long.parseLong(speedText.getText());
printer = new Printer(getArray(), showElement, speed);
// Делаем поток демоном
printer.setDaemon(true);
printer.start();
// После ввода, делаем поле ввода недоступным
speedText.setEnabled(false);
}
Буду рад любым подсказкам или статьям!