Я задал этот вопрос здесь раньше, но это было снесен, потому что это было слишком неконкретно и не имеет «минимальный воспроизводимый пример». :)
В основном я хочу, чтобы мой алгоритм идти следующим образом, как только пользователь нажимает кнопку «Пуск»:
- На сетке 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();
}
}
Я попытался это так много различных подходов, но я просто не похоже, чтобы получить, как использовать «Таймер» правильно. Я был бы очень признателен, если кто-то нашел время, чтобы попытаться реализовать его в коде ниже, так как просто объяснить мне это не приведет меня в любом месте до сих пор. :(
Большое спасибо!
Я неправильно интерпретировал один из ваших требований в ваш последний вопрос: Специфическая задержка в Java Swing в пределах ActionListener? , Так что я буду изложить свои предложения здесь , где у меня есть больше пространства:
В своем классе:
- Создайте ArrayList в качестве переменного экземпляра, так что вы можете получить доступ к ArrayList в вашем ActionListeners
В ActionListener вы добавляете к вашей кнопке вам необходимо:
- добавить 6 случайных кнопки, которые вы хотите, чтобы переключить цвет в ArrayList. Таким образом, вы создаете цикл случайно выбрать 6 кнопок.
- установить цвет первой кнопки в ArrayList
- запустить таймер
В ActionListener таймера, затем:
- сбросить цвет первой кнопки в ArrayList
- удалить первую кнопку из ArrayList
- если ArrayList пуст, остановить таймер
- еще получить первую кнопку и изменить цвет на красный
Таким образом, при нажатии на кнопку Start, первая кнопка окрашен в красный цвет. Он будет оставаться красным, пока таймер не сработает 500мс позже в это время он сбрасывается в значение по умолчанию, а другая кнопка меняется. Таймер будет срабатывать снова в 500мсе и процесс продолжает повторять.
Обратите внимание, как нет зацикливания код в ActionListener таймера. Таймер будет продолжать генерировать событие за каждые 500 мс, пока вы не остановите таймер.
Если вам нужна дополнительная помощь, то спросите прослеживание вопроса, не создавать новую тему.