Задержка в ActionListener в конкретном алгоритме приложений Java Swing?

Дэйв:

Я задал этот вопрос здесь раньше, но это было снесен, потому что это было слишком неконкретно и не имеет «минимальный воспроизводимый пример». :)

В основном я хочу, чтобы мой алгоритм идти следующим образом, как только пользователь нажимает кнопку «Пуск»:

  • На сетке 4х4 кнопок, кнопка рандомизированное становится красным, а затем черный, с задержкой 500 мс между ними.
  • Это повторяется 6 раз

Вот код, где я пытался реализовать «Таймер» за задержку, но не злобно:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestMemoryGame extends JFrame {
private JButton[] button = new JButton[16];
private JButton start;
private JPanel grid;
private int counter = 6;
private Timer timer;
private int delay = 500;

private Color babyBlue = new Color(137, 156, 240);
private Color lightRed = new Color(255,69,0);

public TestMemoryGame() {
    super();
    init();
}

public void init() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setLayout(new GridBagLayout());
    setSize(500, 500);
    setBackground(Color.WHITE);

    grid = new JPanel(new GridLayout(4, 4));

    for (int x = 0; x < 16; x++) {
        button[x] = new JButton();
        button[x].setBackground(babyBlue);
        grid.add(button[x]);
    }
    grid.setPreferredSize(new Dimension(400, 400));
    add(grid);


    start = new JButton("START");
    start.setBackground(Color.ORANGE);
    start.setPreferredSize(new Dimension(150, 30));
    GridBagConstraints c = new GridBagConstraints();
    c.gridy = 1;
    c.insets.top = 10;
    add(start, c);

    start.addActionListener(startTimer);

    timer = new Timer(delay, action);

    pack();
    setVisible(true);
}

ActionListener startTimer = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        timer.start();
    }
};

ActionListener action = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        int[] array = new int[counter];
        for (int x = 0; x < counter; x++) {
            array[x] = (int)(Math.random() * 16);
            button[array[x]].setBackground(lightRed);
            timer.start();
            //Delay of 500
            timer.stop();
            button[array[x]].setBackground(Color.black);
        }
    }
};

public static void main(String[] args) {
    new TestMemoryGame();
}

}

Я попытался это так много различных подходов, но я просто не похоже, чтобы получить, как использовать «Таймер» правильно. Я был бы очень признателен, если кто-то нашел время, чтобы попытаться реализовать его в коде ниже, так как просто объяснить мне это не приведет меня в любом месте до сих пор. :(

Большое спасибо!

camickr:

Я неправильно интерпретировал один из ваших требований в ваш последний вопрос: Специфическая задержка в Java Swing в пределах ActionListener? , Так что я буду изложить свои предложения здесь , где у меня есть больше пространства:

В своем классе:

  1. Создайте ArrayList в качестве переменного экземпляра, так что вы можете получить доступ к ArrayList в вашем ActionListeners

В ActionListener вы добавляете к вашей кнопке вам необходимо:

  1. добавить 6 случайных кнопки, которые вы хотите, чтобы переключить цвет в ArrayList. Таким образом, вы создаете цикл случайно выбрать 6 кнопок.
  2. установить цвет первой кнопки в ArrayList
  3. запустить таймер

В ActionListener таймера, затем:

  1. сбросить цвет первой кнопки в ArrayList
  2. удалить первую кнопку из ArrayList
  3. если ArrayList пуст, остановить таймер
  4. еще получить первую кнопку и изменить цвет на красный

Таким образом, при нажатии на кнопку Start, первая кнопка окрашен в красный цвет. Он будет оставаться красным, пока таймер не сработает 500мс позже в это время он сбрасывается в значение по умолчанию, а другая кнопка меняется. Таймер будет срабатывать снова в 500мсе и процесс продолжает повторять.

Обратите внимание, как нет зацикливания код в ActionListener таймера. Таймер будет продолжать генерировать событие за каждые 500 мс, пока вы не остановите таймер.

Если вам нужна дополнительная помощь, то спросите прослеживание вопроса, не создавать новую тему.

рекомендация

отhttp://10.200.1.11:23101/article/api/json?id=378788&siteId=1
рекомендация