Cómo crear un retraso en Swing

Hice un juego de blackjack, y quiero que el jugador de AI haga una pausa entre tomar cartas. Intenté simplemente usar Thread.sleep (x), pero eso hace que se congele hasta que el jugador de AI termine de tomar todas sus cartas. Sé que Swing no es seguro para subprocesos, así que miré Timers, pero no pude entender cómo podría usar uno para esto. Aquí está mi código actual:

while (JB.total  0)) { case 0: JB.hit(); break; case 1: break done; case 2: JB.hit(); JB.bet *= 2; break done; } } 

Por cierto, el golpe (); método actualiza la GUI.

    Bueno, el siguiente código muestra un JFrame con un JTextArea y un JButton. Cuando se hace clic en los botones, el temporizador envía el evento repetidamente (con un segundo retraso entre ellos) al actionListener relacionado con el botón que agrega una línea con la hora actual.

     import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Calendar; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.Timer; public class TimerTest extends JFrame implements ActionListener{ private static final long serialVersionUID = 7416567620110237028L; JTextArea area; Timer timer; int count; // Counts the number of sendings done by the timer boolean running; // Indicates if the timer is started (true) or stopped (false) public TimerTest() { super("Test"); setBounds(30,30,500,500); setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(null); area = new JTextArea(); area.setBounds(0, 0, 500, 400); add(area); JButton button = new JButton("Click Me!"); button.addActionListener(this); button.setBounds(200, 400, 100, 40); add(button); // Initialization of the timer. 1 second delay and this class as ActionListener timer = new Timer(1000, this); timer.setRepeats(true); // Send events until someone stops it count = 0; // in the beginning, 0 events sended by timer running = false; System.out.println(timer.isRepeats()); setVisible(true); // Shows the frame } public void actionPerformed(ActionEvent e) { if (! running) { timer.start(); running = true; } // Writing the current time and increasing the cont times area.append(Calendar.getInstance().getTime().toString()+"\n"); count++; if (count == 10) { timer.stop(); count = 0; running = false; } } public static void main(String[] args) { // Executing the frame with its Timer new TimerTest(); } } 

    Bueno, este código es una muestra de cómo usar objetos javax.swig.Timer. En relación con el caso particular de la pregunta. La instrucción if para detener el temporizador debe cambiar, y, obviamente, las acciones de la acción realizada. El siguiente fragmento es un esqueleto de la solución actionPerformed:

     public void actionPerformed(ActionEvent e) { if (e.getComponent() == myDealerComponent()) { // I do this if statement because the actionPerformed can treat more components if (! running) { timer.start(); runnig = true; } // Hit a card if it must be hitted switch (getJBTable(JB.total, JB.aces > 0)) { case 0: JB.hit(); break; case 1: break done; case 2: JB.hit(); JB.bet *= 2; break done; } if (JB.total >= 21) { // In this case we don't need count the number of times, only check the JB.total 21 reached timer.stop() running = false; } } } 

    En mi humilde opinión, esto resuelve el problema, ahora @ usuario920769 debe pensar dónde puso actionListener y las condiciones de inicio / detención …

    @kleopatra: Gracias por mostrarme la existencia de esta clase de temporizador, no sé nada al respecto y es increíble, hacer posible muchas cosas en una aplicación de swing 🙂

    entonces miré Timers, pero no pude entender cómo podría usar uno para esto

    El temporizador es la solución, ya que como dices estás actualizando la GUI que debe hacerse en el EDT.

    No estoy seguro de cuál es tu preocupación. Usted reparte una carta y enciende el temporizador. Cuando el temporizador se dispara, decide tomar otra tarjeta o sostenerla. Cuando sostienes tu parada, el temporizador.

    Bueno, una explicación rápida sobre Timers.

    Antes que nada, necesitas una variable java.util.Timer en tu clase y otra clase en tu proyecto que se extienda desde java.util.TimerTask (llamémoslo Tasker).

    La inicialización de la variable Timer es muy fácil:

     Timer timer = new Timer(); 

    Ahora la clase Tasker:

     public class Tasker extends TimerTask { @Override public void run() { actionToDo(); // For example take cards } // More functions if they are needed } 

    Finalmente, la instalación del temporizador con su Tasker relacionado:

     long delay = 0L; long period = pauseTime; timer.schedule(new Tasker(),delay,period); 

    La función de progtwigción indica lo siguiente: Param de Fisrt: Acción para hacer cada milisegundos de período (Ejecuta la función de ejecución de una clase TimerTask o su extensión) Segundo parámetro: Cuando el temporizador debe comenzar. En este caso, comienza cuando se llama a la función de progtwigción. El siguiente ejemplo indica un inicio de 1 segundo después de llamar a la función de progtwigción: timer.schedule(new Tasker(),1000,period); Tercer parámetro: milisegundos entre una llamada de la función Tasker.run () y la siguiente llamada.

    Espero que entiendas este microtutorial :). Si tiene algún problema, solicite información más detallada.

    ¡Saludos cordiales!

    Creo que en este tutorial está claro cómo usar Timers para lograr lo que quieres, sin tener que lidiar con Threads.