在 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 图像制作动画的主要内容,如果未能解决你的问题,请参考以下文章