Как остановить\ запустить вывод элементов массива при помощи кнопки

Проблема: Я только начал знакомиться с 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);
        }

Буду рад любым подсказкам или статьям!


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