在 JPanel 上为 .GIF 图像制作动画

Posted

技术标签:

【中文标题】在 JPanel 上为 .GIF 图像制作动画【英文标题】:Animating a .GIF image on a JPanel 【发布时间】:2014-03-14 06:42:58 【问题描述】:

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

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文件保存在同一目录下。

感谢任何帮助,谢谢。很抱歉只发布代码,但我不知道您还需要什么信息。请问有没有事。

【问题讨论】:

作为注释在该可覆盖方法的第一行调用super.paintComponent() 什么不起作用?图片不显示? 是的,它只显示一个空框架 【参考方案1】:

"player.gif文件为一文件中的两张图片,与java文件保存在同一目录下。"

应该从类路径加载图像。将字符串传递给ImageIcon 会从文件系统加载图像,在这种情况下,您的路径将不起作用。

要从类路径加载,只需这样做

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

只要您的文件与您描述的 .java 文件在同一个包中,图像就应该内置到您的类路径中。

你也可以使用ImageIO类读取图片,如果图片加载不出来会抛出异常,会抛出FileNotFoundException这样就知道你的路径不对了

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


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

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

旁注

JPanel 上绘画时,您应该覆盖getPreferredSize(),这将为JPanel 提供首选尺寸,然后您可以只使用pack() 您的框架,应该这样做。

@Override
public Dimension getPreferredSize() 
    return new Dimension(400, 400);

同样paintComponent 应该是protected 而不是public

【讨论】:

ImageIO 不是加载动画 GIF 的最佳方式。详情请见this Q&A。

以上是关于在 JPanel 上为 .GIF 图像制作动画的主要内容,如果未能解决你的问题,请参考以下文章

将 Swing Timer 与 gif 图像同步

Java:在其他动画 gif 上叠加/覆盖动画 gif

Imagick 制作动画 GIF 不动画?

如何在xamarin android中将位图图像转换为gif?

MATLAB制作GIF动画

在奇数位置制作动画时在 Chrome 中晃动图像