Retraso en ActionListener algoritmo específico en Java Swing?

David:

He hecho esta pregunta aquí antes, pero he bajado porque era demasiado inespecíficos y no ofreció "ejemplo reproducible mínimo". :)

Básicamente quiero que mi algoritmo para ir de la siguiente manera, tan pronto como un usuario hace clic en "Inicio":

  • En la cuadrícula de 4x4 de botones, un botón aleatorio se pone rojo, negro y luego, con un retraso de 500 ms en el medio.
  • Esto se repite 6 veces

Aquí está el código en la que he tratado de poner en práctica "Temporizador" por el retraso, pero no pudo brutalmente:

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();
}

}

He intentado esto con tantos enfoques diferentes, pero que simplemente no parecen llegar a usar "Temporizador" correctamente. Realmente agradecería, si alguien se tomó el tiempo para tratar de ponerlo en práctica en el código de abajo, ya que simplemente explicar a mí no me ha llevado hasta el momento en cualquier lugar. :(

¡Muchas gracias!

camickr:

Leí mal uno de sus requisitos en su última pregunta: Retraso específico en Java Swing dentro de un ActionListener? , Así que voy a repetir mis sugerencias aquí de nuevo en el que tengo más espacio:

En tu clase:

  1. Crear un ArrayList como una variable de instancia para que pueda acceder al ArrayList en sus ActionListeners

En el ActionListener que añadir a su botón que debe:

  1. añadir los 6 botones al azar que desea cambiar el color a la ArrayList. Así que va a crear un bucle para recoger al azar 6 botones.
  2. establecer el color del primer botón de la ArrayList
  3. iniciar el temporizador

En el ActionListener del temporizador que lo haría a continuación:

  1. restablecer el color del primer botón de la ArrayList
  2. quitar el primer botón de la ArrayList
  3. si el ArrayList está vacía, se detiene el temporizador
  4. otra cosa conseguir el primer botón y cambiar el color al rojo

Por lo tanto, cuando se hace clic en el botón Inicio, en el primer botón es de color rojo. Permanecerá rojo hasta que el temporizador se dispara 500 ms tarde momento en el que se restablece al valor predeterminado y se cambia otro botón. El temporizador se disparará de nuevo en 500 ms y el proceso se sigue repitiendo.

Nota cómo no existe un código de bucle en el ActionListener del temporizador. El temporizador mantendrá la generación de un evento cada 500 ms hasta que detenga el temporizador.

Si necesita más ayuda, a continuación, pedir un seguimiento pregunta, no cree un nuevo hilo.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=378794&siteId=1
Recomendado
Clasificación