假设我有一个JFrame
和一个JButton
。.gif
单击按钮后,我想显示动画 ( ) 图像。而另一个事件(比如ActionEvent e
)停止在JFrame
. 我的方法应该是什么?
问问题
10452 次
2 回答
8
显示第一张图片(动画帧)JLabel
。当用户单击按钮时,启动一个 SwingTimer
将标签的图标更改为下一帧,一旦显示所有帧就循环。当用户再次单击按钮时,停止动画。
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
class Chomper {
public static void main(String[] args) throws Exception {
final Image[] frames = {
ImageIO.read(new URL("http://i.stack.imgur.com/XUmOD.png")),
ImageIO.read(new URL("http://i.stack.imgur.com/zKyiD.png")),
ImageIO.read(new URL("http://i.stack.imgur.com/4maMm.png")),
ImageIO.read(new URL("http://i.stack.imgur.com/wn9V5.png"))
};
Runnable r = new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new BorderLayout());
final JLabel animation = new JLabel(new ImageIcon(frames[0]));
gui.add(animation, BorderLayout.CENTER);
ActionListener animate = new ActionListener() {
private int index = 0;
@Override
public void actionPerformed(ActionEvent e) {
if (index<frames.length-1) {
index++;
} else {
index = 0;
}
animation.setIcon(new ImageIcon(frames[index]));
}
};
final Timer timer = new Timer(200,animate);
final JToggleButton b = new JToggleButton("Start/Stop");
ActionListener startStop = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (b.isSelected()) {
timer.start();
} else {
timer.stop();
}
}
};
b.addActionListener(startStop);
gui.add(b, BorderLayout.PAGE_END);
JOptionPane.showMessageDialog(null, gui);
}
};
// Swing GUIs should be created and updated on the EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
SwingUtilities.invokeLater(r);
}
}
于 2013-04-16T14:56:10.480 回答
3
我不知道如何从 gif 中获取帧/图像,但如果您可以访问它们,那么您可以使用Animated Icon类为您制作动画。它在幕后使用计时器来制作动画,因此您可以根据需要简单地启动/停止/暂停计时器。
于 2013-04-16T15:14:17.910 回答