Sprite动画计时java swing

Sprite动画计时java swing,java,swing,animation,sprite,animated-gif,Java,Swing,Animation,Sprite,Animated Gif,我尝试使用Swing在JAVA中制作精灵动画。下面的代码是一个ImageIcon数组,为了显示几个不同的图像,我将对其进行迭代(仅2个用于测试目的)。 但我不知道如何正确地计算每次迭代的时间。我的意思是,当我编译我正在处理的标签代码时,只显示数组的最后一个图像(很明显),但我希望它显示一些ms的第一个图像,然后显示另一个。 我做了一些研究,看到了一些关于时间类的建议,但我真的不知道如何在这些环境中实现它。我还尝试使用睡眠,它在C++中运行良好,但只出现了thule.睡觉,在这种情况下不起作用。p

我尝试使用Swing在JAVA中制作精灵动画。下面的代码是一个ImageIcon数组,为了显示几个不同的图像,我将对其进行迭代(仅2个用于测试目的)。 但我不知道如何正确地计算每次迭代的时间。我的意思是,当我编译我正在处理的标签代码时,只显示数组的最后一个图像(很明显),但我希望它显示一些ms的第一个图像,然后显示另一个。 我做了一些研究,看到了一些关于时间类的建议,但我真的不知道如何在这些环境中实现它。我还尝试使用睡眠,它在C++中运行良好,但只出现了thule.睡觉,在这种情况下不起作用。p> 该动画应该模拟一张正在翻转的扑克牌(用于垄断游戏)

有人能就这件事给我一些意见吗

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class Sprite2 {

    private ImageIcon[] sprites;

    private ImageIcon a = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
    private ImageIcon b = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");

    public Sprite2() {

        sprites = new ImageIcon[] {a, b};
    }

    public void render(JLabel lbl) {

        for (int i = 0; i < sprites.length; i++) {
                 lbl.setIcon(sprites[i]);
                 //sleep(1000); - Looking for a similar Java function which is able to delay each iteration and make it look like a gif 
    }
}
import javax.swing.ImageIcon;
导入javax.swing.JLabel;
公共类精神2{
私有图像图标[]精灵;
private ImageIcon a=新的ImageIcon(“C:/Users/Guilherme/Desktop/G/FEUP/2ºAno/第二学期/Eclipse repos/Sprite/src/images/ball.jpg”);
private ImageIcon b=新的ImageIcon(“C:/Users/Guilherme/Desktop/G/FEUP/2ºAno/2nd-sement/Eclipse repos/Sprite/src/images/transferir.jpg”);
公共精神2(){
精灵=新的图像图标[]{a,b};
}
公共无效渲染(JLabel lbl){
for(int i=0;i
您可以使用Swing定时器,有关详细信息,请参阅


您不应该在事件调度线程上使用
sleep()
,因为它将停止线程处理绘制和其他与UI相关的事件,UI将被冻结。有关更多详细信息,请参阅教程。

您可以使用Swing timer,请参阅以获取更多详细信息


您不应该在事件调度线程上使用
sleep()
,因为它将停止线程处理绘制和其他与UI相关的事件,UI将被冻结。有关更多详细信息,请参阅教程。

您可以使用Swing timer,请参阅以获取更多详细信息


您不应该在事件调度线程上使用
sleep()
,因为它将停止线程处理绘制和其他与UI相关的事件,UI将被冻结。有关更多详细信息,请参阅教程。

您可以使用Swing timer,请参阅以获取更多详细信息


您不应该在事件调度线程上使用
sleep()
,因为它将停止线程处理绘制和其他与UI相关的事件,UI将被冻结。有关更多详细信息,请参阅教程。

我使用计时器解决了这个问题

由于某些原因,第一帧不会显示在第一个动画中,因此精灵[0]和[1]是同一图像

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


public class Sprite extends JPanel implements ActionListener{

    private ImageIcon[] sprites = new ImageIcon[4]; 
    private Timer time;
    private int delay = 500, currentFrame = 0; 


    private ImageIcon a0 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
    private ImageIcon a1 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
    private ImageIcon a2 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/smurf_sprite.png");


    public Sprite() {

        sprites[0] = a0;
        sprites[1] = a0;
        sprites[2] = a1;
        sprites[3] = a2;

        time = new Timer(delay, this);
        time.start();
    }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        sprites[currentFrame].paintIcon(this, g, 0, 0);

        if (currentFrame == sprites.length-1) {
            time.stop();
        }
        else currentFrame++;
    }

    public void actionPerformed(ActionEvent e) {

        repaint();
    }

    public static void main(String[] arg) {
        JFrame f = new JFrame();
        Sprite s = new Sprite();
        f.add(s);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(500,400);
    }
}

我是用定时器算出的

由于某些原因,第一帧不会显示在第一个动画中,因此精灵[0]和[1]是同一图像

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


public class Sprite extends JPanel implements ActionListener{

    private ImageIcon[] sprites = new ImageIcon[4]; 
    private Timer time;
    private int delay = 500, currentFrame = 0; 


    private ImageIcon a0 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
    private ImageIcon a1 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
    private ImageIcon a2 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/smurf_sprite.png");


    public Sprite() {

        sprites[0] = a0;
        sprites[1] = a0;
        sprites[2] = a1;
        sprites[3] = a2;

        time = new Timer(delay, this);
        time.start();
    }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        sprites[currentFrame].paintIcon(this, g, 0, 0);

        if (currentFrame == sprites.length-1) {
            time.stop();
        }
        else currentFrame++;
    }

    public void actionPerformed(ActionEvent e) {

        repaint();
    }

    public static void main(String[] arg) {
        JFrame f = new JFrame();
        Sprite s = new Sprite();
        f.add(s);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(500,400);
    }
}

我是用定时器算出的

由于某些原因,第一帧不会显示在第一个动画中,因此精灵[0]和[1]是同一图像

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


public class Sprite extends JPanel implements ActionListener{

    private ImageIcon[] sprites = new ImageIcon[4]; 
    private Timer time;
    private int delay = 500, currentFrame = 0; 


    private ImageIcon a0 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
    private ImageIcon a1 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
    private ImageIcon a2 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/smurf_sprite.png");


    public Sprite() {

        sprites[0] = a0;
        sprites[1] = a0;
        sprites[2] = a1;
        sprites[3] = a2;

        time = new Timer(delay, this);
        time.start();
    }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        sprites[currentFrame].paintIcon(this, g, 0, 0);

        if (currentFrame == sprites.length-1) {
            time.stop();
        }
        else currentFrame++;
    }

    public void actionPerformed(ActionEvent e) {

        repaint();
    }

    public static void main(String[] arg) {
        JFrame f = new JFrame();
        Sprite s = new Sprite();
        f.add(s);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(500,400);
    }
}

我是用定时器算出的

由于某些原因,第一帧不会显示在第一个动画中,因此精灵[0]和[1]是同一图像

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


public class Sprite extends JPanel implements ActionListener{

    private ImageIcon[] sprites = new ImageIcon[4]; 
    private Timer time;
    private int delay = 500, currentFrame = 0; 


    private ImageIcon a0 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/ball.jpg");
    private ImageIcon a1 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/transferir.jpg");
    private ImageIcon a2 = new ImageIcon("C:/Users/Guilherme/Desktop/G/FEUP/2º Ano/2nd semester/Eclipse repos/Sprite/src/images/smurf_sprite.png");


    public Sprite() {

        sprites[0] = a0;
        sprites[1] = a0;
        sprites[2] = a1;
        sprites[3] = a2;

        time = new Timer(delay, this);
        time.start();
    }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        sprites[currentFrame].paintIcon(this, g, 0, 0);

        if (currentFrame == sprites.length-1) {
            time.stop();
        }
        else currentFrame++;
    }

    public void actionPerformed(ActionEvent e) {

        repaint();
    }

    public static void main(String[] arg) {
        JFrame f = new JFrame();
        Sprite s = new Sprite();
        f.add(s);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(500,400);
    }
}