如何在JFrame上为ImageIcon设置动画,图片将加载但不会更改

时间:2015-11-08 15:25:35

标签: java swing animation

我试图为我的游戏制作一个精灵来制作动画,然后将它加载到背景上的JFrame中,但它不会改变到我动画的下一帧有没有人知道如何解决这个问题?如果这是一个简单的错误,我很抱歉,但我是java新手。

我的主要课程

package com.projectelrond.main;

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

import com.projectelrond.Sprites.Ranger;

public class Main extends JFrame{

private static final long serialVersionUID = 1L;

public int WIDTH = 160, HEIGHT = WIDTH/12 *9, SCALE = 3, X = 10, Y = 10;

public boolean running = false;

JFrame f = new JFrame("name");

BackGround bg = new BackGround();
JLabel BackGround = new JLabel(new ImageIcon(bg.Bg));

Ranger R = new Ranger();
JLabel Ranger = new JLabel(R.RangerA[R.I]);

public static void main(String[] args) {
    new Main();

}

public Main() {

    Ranger.setSize(Ranger.getPreferredSize());

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(WIDTH * SCALE, HEIGHT * SCALE);
    f.setResizable(false);

    running = true;

    BackGround.add(Ranger);

    f.add(BackGround);
    f.setVisible(true);


    run();
}

public void run() {
    while (running) {
        Render();
    }
}

public void Render() {
    Ranger.repaint();
}

}

我的游侠类(我试图让它变为动画)

package com.projectelrond.Sprites;

import java.awt.Graphics;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.Timer;

public class Ranger extends JLabel implements ActionListener {

private static final long serialVersionUID = 1L;

public int X, Y, I = 0, TotalImages = 2;

public BufferedImage Ranger1, Ranger2;

public ImageIcon RangerA[]; 

private Timer RTimer;

public Ranger() {
    try {
        Ranger1 = ImageIO.read(getClass().getResource("/Images/Sprites/Ranger" + 0 + ".png"));
        Ranger2 = ImageIO.read(getClass().getResource("/Images/Sprites/Ranger" + 1 + ".png"));

    } catch (IOException e) {
        e.printStackTrace();
    }
    Array();
}


public void Array() {
    RangerA = new ImageIcon[TotalImages]; {
        RangerA[0] = new ImageIcon(Ranger1);
        RangerA[1] = new ImageIcon(Ranger2);
    }
    startAnimation();
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (RangerA[I].getImageLoadStatus() == MediaTracker.COMPLETE) {
        RangerA[I].paintIcon(this, g, 0, 0);
        I = (I + 1) % TotalImages;
    }
}

public void startAnimation() {
    if (RTimer == null) {
        I = 0;
        RTimer = new Timer(100, this);
        RTimer.start();
    } else if (!RTimer.isRunning()) {
        RTimer.restart();
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    repaint();
}
}

1 个答案:

答案 0 :(得分:2)

变量名称不应以大写字符开头。方法名称不应以大写字符开头。您使用的任何教科书或您找到的教程都将遵循Java命名约定。不要自己做。

不要扩展JLabel。没有必要做自定义绘画。您要做的就是切换图标并让标签绘制图标本身。

所以一种方法是为你的Timer创建一个类。创建类时,可以传入JLabel和图标数组。然后这个类将启动Timer并更改Array的索引,最后只需使用正确的Icon调用label.setIcon(...)。所以基本上你的Ranger类只会实现Timer的ActionListener。

对于略有不同的方法,您可以查看Animated Icon。此解决方案创建一个自定义图标,可以切换图标本身。所以你只需将Icon添加到标签上。