简体   繁体   中英

Move JLabel in GridLayout java swing

I'm trying to move a Robot represented by a JLabel into a GridLayout. The move is made but the display of the JLabel is only done for the final finishing square. I would like to see the move from box to box. How can I do?

import java.awt.Color;
import java.awt.Component;
import java.awt.LayoutManager;
import java.io.Serializable;
import java.util.Vector;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.LayoutStyle;

// Robot

public class Robot extends Case implements Serializable {
    private ImageIcon imageRobot;
    private Color couleur;

    public Robot () {
        imageRobot = new ImageIcon("./assets/balle.png");
        setIcon(imageRobot);
    }

    public void seDeplacer (JPanel panel, Vector<Case> listeDeCases) {      
        for (int i=0; i<5; i++) {
            LayoutManager layout = panel.getLayout();   
            try {   Thread.sleep(1000);
            panel.remove(panel.getComponent(i));
            panel.add(this, i);
            panel.doLayout();
            }
            catch (InterruptedException e) {}
        }
    }

    public void detruire () {

    }

    public void setCouleur (Color couleur) {
        this.couleur=couleur;
    }

    public Color getCouleur () {
        return this.couleur;
    }

}
        try {   Thread.sleep(1000);

Don't do this on the AWT Event Dispatch Thread (EDT). Your GUI can't be repainted because this code is blocking it.

Use javax.swing.Timer (not to be confused with any other Timer ) to set an event for the next time robot needs to be moved. You will need to keep track of state outside of local variables.

import java.awt.Color;
import java.awt.Component;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.Vector;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.LayoutStyle;
import javax.swing.Timer;

// Robot

public class Robot extends Case implements Serializable {
    private ImageIcon imageRobot;
    private Color couleur;

    public Robot () {
        imageRobot = new ImageIcon("./assets/balle.png");
        setIcon(imageRobot);
    }

    public void seDeplacer (JPanel panel) {
        Robot currentRoot = this;
            int delay = 1000; //milliseconds
              ActionListener taskPerformer = new ActionListener() {
                  public void actionPerformed(ActionEvent evt) {
                        for (int i=0; i<5; i++) {
                        panel.remove(panel.getComponent(i));
                        panel.add(currentRoot, i);
                        panel.doLayout();   
                        }
                  }
              };
              new Timer(delay, taskPerformer).start();

    }

    public void detruire () {

    }

    public void setCouleur (Color couleur) {
        this.couleur=couleur;
    }

    public Color getCouleur () {
        return this.couleur;
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM