java - 如何在 JFrame 上对 ImageIcon 进行动画处理,图像将加载但不会更改

标签 java swing animation

我正在尝试为我的游戏制作一个 Sprite ,以将其加载到背景顶部的 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();
}

}

还有我的游骑兵类(class)(我正在尝试将其制作成动画)

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

最佳答案

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

不要扩展 JLabel。无需进行定制绘画。您要做的就是切换图标并让标签绘制图标本身。

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

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

关于java - 如何在 JFrame 上对 ImageIcon 进行动画处理,图像将加载但不会更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33595587/

相关文章:

java - SwingEventMonitor 发生了什么?

Java如何在窗口或JFrame的边框/周围放置一个按钮

swift - 使用 TouchesBegan 在 vi​​ewDidAppear Swift 中停止动画

Android ImageView模糊动画

java - Eclipse 上的 Glassfish : JDK required rather than a JRE while I already have JDK

java - 如何调用Rest API并使用该API中的数据?

java - Collections.max() 不正确的参数

java - 创建 QName 异常时,Opensaml unmarshallMessage 给出 opensaml 本地部分不能为 "null"

java - 使用 ChangeListener 触发 Java Swing 中的更改?

jQuery if (.scrollTop() < 100) 仅适用于页面加载...?