在JPanel上设置.GIF图像的动画

时间:2014-02-14 18:49:03

标签: java swing gif animated

我有一些代码应该让玩家有动画,走路,但由于某种原因它不起作用。这是我的代码:

import javax.swing.*;
import java.awt.*;

/**
* Created by evengultvedt on 14.02.14.
*/

import javax.swing.*;
import java.awt.*;
//The board class, which the drawing is on
class Board extends JPanel {
    //The image of the player
    private Image imgPlayer;

public Board() {
    setPreferredSize(new Dimension(400, 400));
    setBackground(Color.WHITE);
    setVisible(true);
    //getting the player.gif file
    ImageIcon player = new ImageIcon("player.gif");
    //and put in the imgPlayer variable
    imgPlayer = player.getImage();
}
public void paintComponent(Graphics graphics) {
    Graphics2D graphics2D = (Graphics2D) graphics;
    //this doesn't work
    graphics2D.drawImage(imgPlayer, 10, 10, 100, 100, null);
    //this works
    graphics2D.drawString("Test drawing", 120, 120);
}
}

//The JFrame to put the panel on
class AnimatePlayer extends JFrame{

    public AnimatePlayer() {
        Board board = new Board();
        add(board);
        setTitle("PlayerTestAnimation");
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 400);
        setVisible(true);

    }

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new AnimatePlayer();
        }
    });
}
}

player.gif文件是一个文件中的两张图片,并保存在与java文件相同的目录中。

感谢任何帮助,谢谢。我很抱歉只发布代码,但我不知道你需要什么更多的信息。请问是否有什么。

1 个答案:

答案 0 :(得分:1)

  

“player.gif文件是一个文件中的两张图片,并保存在与java文件相同的目录中。”

应该从类路径加载图像。将字符串传递给ImageIcon会从文件系统中加载图像,在这种情况下,您的路径将无法正常工作。

要从类路径加载,只需执行此操作

ImageIcon img = new ImageIcon(getClass().getResource("player.gif"));

只要您的文件与您所描述的.java文件位于同一个包中,图像就会嵌入到您的类路径中。

您还可以使用ImageIO类来读取图像,如果无法加载图像会抛出异常,这会抛出FileNotFoundException,因此您知道路径错误< / p>

Image img;
try {
    img = ImageIO.read(getClass().getResource("player.gif"));
} catch (IOException ex) {
    ex.printStackTrace():
}

此外,您应该在super.paintComponent(g)方法中调用paintComponent,并且在必要时使用@Override注释作为好的做法

@Override
protected void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);

旁注

  • JPanel上绘画时,您应该覆盖getPreferredSize(),这会为JPanel提供首选尺寸,那么您只需pack()您的框架{<1}} em>应该正在做。

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }
    
  • 同样paintComponent应该是protected而不是public