Aktualisieren von JButton auf einem Timer in einer Do-While-Schleife

Ich habe einige Probleme damit, einen JButton in einer Do-While-Schleife wiederholt (mit einem Timer) zu aktualisieren. Ich arbeite an einem einfachen Spiel, das auf einem 10 * 10-Raster von Kachelobjekten gespielt wird, die einer JButton-Array-Liste mit 100 Schaltflächen entsprechen.

Dieser Teil des Programms übernimmt die einfache Pfadfindung (d. H., Wenn ich auf ein Zeichen klicke, dann auf eine leere Kachel, bewegt sich das Zeichen durch jede Kachel auf dem Weg zum Ziel). Zwischen jedem Schritt liegt eine Verzögerung, damit der Benutzer den Fortschritt des Charakters sehen kann.

Nach dem gegenwärtigen Stand der Dinge ist die Bewegung korrekt, aber der JButton wird nur aktualisiert, wenn der Charakter das Ziel erreicht, nicht in Zwischenschritten.

public void move(int terrainTile)
{
    int currentPosition = actorList.get(selectedActor).getPosition();
    int movementValue = 0;
    int destination = terrainTile;
    int destinationX = destination / 10;
    int destinationY = destination % 10;

    do
    {
        currentPosition = actorList.get(selectedActor).getPosition();  // Gets PC's current position (before move)
        System.out.println("Old position is " + currentPosition);
        int currentX = currentPosition / 10;
        int currentY = currentPosition % 10;


        if(actorList.get(selectedActor).getCurrentAP() > 0)
        {
            movementValue = 0;

            if(destinationX > currentX)
            {
                movementValue += 10;
            }

            if(destinationX < currentX)
            {
                movementValue -= 10;
            }

            if(destinationY > currentY)
            {
                movementValue += 1;
            }

            if(destinationY < currentY)
            {
                movementValue -= 1;
            }

            int nextStep = currentPosition + movementValue;

            myGame.setActorIdInTile(currentPosition, -1);  //Changes ActorId in PC current tile back to -1
            scrubTiles(currentPosition);

            actorList.get(selectedActor).setPosition(nextStep);  //  Sets new position in actor object
            System.out.println("Actor " + selectedActor + " " + actorList.get(selectedActor).getName() + " position has been updated to " + nextStep);

            myGame.setActorIdInTile(nextStep, selectedActor); // Sets ActorId in moved to Tile
            System.out.println("Tile " + nextStep + " actorId has been updated to " + selectedActor);

            buttons.get(nextStep).setIcon(new ImageIcon(actorList.get(selectedActor).getImageName()));

            // If orthagonal move AP-4
            if(movementValue == 10 || movementValue == -10 || movementValue == 1 || movementValue == -1)
            {
                actorList.get(selectedActor).reduceAP(4);
            }
            // If diagonal move AP-6
            else
            {
                actorList.get(selectedActor).reduceAP(6);
            }

            System.out.println(actorList.get(selectedActor).getName() + " has " + actorList.get(selectedActor).getCurrentAP() + " AP remaining");

            try
            {
                Thread.sleep(500);    // one second
            }
            catch (Exception e){} 

            buttons.get(nextStep).repaint();

        }

        else
        {
            System.out.println(actorList.get(selectedActor).getName() + " has insufficient AP to move");
            break;
        }

    }while(destination != (currentPosition + movementValue));

Was ich versucht habe:

buttons.get (nextStep) .repaint (); (Es wurde versucht, einen Befehl zum Neulackieren der Schaltfläche nach dem Festlegen des imageIcon einzugeben. Keine Änderung.

buttons.get (nextStep) .revalidate (); (Keine 100% ige Gewissheit, was dies bewirkt - es hat sich als mögliche Lösung herausgestellt, funktioniert aber nicht.

Schritte 1 und 2 kombiniert

Ein Blick in die Swing-Timer-Klasse - Bewegung findet nicht jedes Mal statt, wenn ein actionEvent ausgelöst wird (nur wenn der Charakter ausgewählt und das Zielfeld leer ist)

Jede Hilfe wäre sehr dankbar!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage