Verzögerung in Action in bestimmtem Java Swing-Algorithmus?

Dave:

Ich habe diese Frage schon mal hier gefragt, aber es wird genommen, weil es zu unspezifisch war und nicht „minimal reproduzierbares Beispiel“ verfügen. :)

Grundsätzlich möchte ich meinen Algorithmus gehen Sie wie folgt vor, sobald ein Benutzer klickt auf „Start“:

  • Auf dem 4x4-Raster der Tasten, dreht sich um eine randomisierte Taste rot, dann schwarz, mit einer Verzögerung von 500 ms dazwischen.
  • Dies wird 6 mal wiederholt

Hier ist der Code, wo ich versucht habe zu „Timer“ für die Verzögerung zu implementieren, aber nicht bösartig:

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

}

Ich habe schon versucht, diese mit so vielen verschiedenen Ansätzen, aber ich scheine einfach nicht zu bekommen, wie „Timer“ richtig zu verwenden. Ich würde wirklich schätzen, wenn jemand die Zeit genommen hat, um zu versuchen und es in dem folgenden Code zu implementieren, da es einfach zu mir erklärt habe mich nicht überall führt so weit. :(

Vielen Dank!

camickr:

Ich falsch verstand einen Ihrer Anforderungen in Ihrer letzten Frage: Spezifische Verzögerung in Java Swing in einer Action? , Also werde ich meine Vorschläge hier wieder neu formulieren , wo ich mehr Platz haben:

In deiner Klasse:

  1. Erstellen Sie eine Arraylist als Instanzvariable, so dass Sie die Arraylist in Ihrem ActionListeners zugreifen

In der Action Sie Ihre Schaltfläche hinzufügen müssen Sie:

  1. fügen Sie die 6 zufällige Tasten, dass Sie die Farbe auf die Arraylist wechseln wollen. So haben Sie eine Schleife erstellen werden holen zufällig 6 Tasten.
  2. Legen Sie die Farbe der ersten Taste in der Arraylist
  3. Starten Sie den Timer

Im Action des Timer würden Sie dann:

  1. setzen Sie die Farbe der ersten Taste in der Arraylist
  2. Entfernen Sie die erste Schaltfläche aus der Arraylist
  3. wenn die Arraylist leer ist, stoppen Sie den Timer
  4. bekommen sonst den ersten Knopf und ändern die Farbe Rot

Also, wenn Sie auf die Schaltfläche Start klicken, wird die erste Taste ist rot gefärbt. Es wird Red bleiben, bis der Timer 500 ms später, zu welchem ​​Zeitpunkt ausgelöst wird er auf die Ausfall- und andere Taste geändert wird. Der Timer wird Feuer wieder in 500ms und der Prozess wiederholt immer wieder.

Beachten Sie, wie kein Looping Code dort im Action des Timer ist. Der Timer hält ein Ereignis zu erzeugen alle 500 ms, bis Sie den Timer stoppen.

Wenn Sie weitere Hilfe benötigen, wenden Sie sich dann ein Follow-up-Frage, nicht einen neuen Thread erstellen.

Ich denke du magst

Origin http://10.200.1.11:23101/article/api/json?id=378787&siteId=1
Empfohlen
Rangfolge