Задержка в ActionListener в конкретном c Java алгоритме Swing? - PullRequest
1 голос
/ 31 марта 2020

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

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

  • На сетке кнопок 4x4 случайная кнопка поворачивается красный, затем черный, с задержкой в ​​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();
    }
}

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

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

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Я неверно истолковал одно из ваших требований в вашем последнем вопросе: Specifi c Задержка Java Качание в ActionListener? , поэтому я еще раз повторю свои предложения здесь, где у меня больше места:

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

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

В ActionListener, который вы добавляете в свой Кнопка, вам нужно:

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

В ActionListener of Timer:

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

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

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

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

0 голосов
/ 31 марта 2020

Здесь есть одна очевидная проблема:

@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();  // **** here ****
        button[array[x]].setBackground(Color.black);
    }
}

вы звоните timer.stop() сразу после вызова timer.start() и не даете таймеру шанс. Возможно, вы захотите остановить Timer из его собственного ActionListener, когда он закончит свою работу.

Кроме того, он не компилируется:

timer = new Timer(delay, action);

Нет переменной с именем action в любом месте в опубликованном коде, за исключением этого вызова метода, и это должно привести к ошибке Cannot Find Symbol.

Таким образом, решение может быть:

timer.addActionListener(timerDelay, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (someCondition) {
            // do Timer's business repeating until condition is false
        } else {
            // condition now false
            ((Timer) e.getSource()).stop(); // stop the Timer
        }       
    }
});

Обратите внимание, что в пределах Если блок, вы можете увеличить значение переменной счетчика, равное 0 непосредственно перед запуском таймера, а затем проверить состояние этой переменной в someCondition. Таким образом, при желании вы можете повторить действие 5 раз.

...