java swing中单击时的图像动画
假设我有一个java swing中单击时的图像动画,java,image,swing,jbutton,animated-gif,Java,Image,Swing,Jbutton,Animated Gif,假设我有一个JFrame和一个JButton。单击按钮后,我想显示动画(.gif)图像。而另一个事件(例如ActionEvent e)停止在JFrame中显示动画。我的方法应该是什么?在JLabel中显示第一个图像(动画帧)。当用户单击该按钮时,启动Swing计时器,将标签图标更改为下一帧,显示所有帧后循环。当用户再次单击按钮时,停止动画 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.Act
JFrame
和一个JButton
。单击按钮后,我想显示动画(.gif
)图像。而另一个事件(例如ActionEvent e
)停止在JFrame
中显示动画。我的方法应该是什么?在JLabel
中显示第一个图像(动画帧)。当用户单击该按钮时,启动Swing计时器,将标签图标更改为下一帧,显示所有帧后循环。当用户再次单击按钮时,停止动画
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);
}
}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.net.URL;
导入javax.imageio.imageio;
导入javax.swing.*;
类Chomper{
公共静态void main(字符串[]args)引发异常{
最终图像[]帧={
ImageIO.read(新URL(“http://i.stack.imgur.com/XUmOD.png")),
ImageIO.read(新URL(“http://i.stack.imgur.com/zKyiD.png")),
ImageIO.read(新URL(“http://i.stack.imgur.com/4maMm.png")),
ImageIO.read(新URL(“http://i.stack.imgur.com/wn9V5.png"))
};
Runnable r=新的Runnable(){
@凌驾
公开募捐{
jpanelgui=newjpanel(newborderlayout());
最终JLabel动画=新JLabel(新图像图标(帧[0]);
添加(动画、边界布局、中心);
ActionListener动画=新建ActionListener(){
私有整数指数=0;
@凌驾
已执行的公共无效操作(操作事件e){
如果(索引我不知道如何从gif中获取帧/图像,但是如果您可以访问它们,那么您可以使用该类为您制作动画。它在后台使用计时器制作动画,因此您可以随意启动/停止/暂停计时器。@EranMedan:我想他想启动
和停止
imation,而不仅仅是要显示它我想我既不是想显示图像也不是对帧有问题,所以这些建议没有帮助。“我想在单击按钮后显示动画(.gif
最好是)图像。”GIF是唯一支持动画的格式。所以说“最好”只是让人困惑。我猜最重要的是“动画”。请确认,然后编辑你的问题,使其更清晰。这些建议没有帮助。
那么也许你应该问一个清楚的问题。人们正在尽最大努力处理这些信息iven。删除“Preference”一词并不能解决任何问题。如何从gif中访问单个帧/图像?图像的来源见。+1,您在我发布答案时更新了来源。我想知道内部帧与此有什么关系。@camickr抱歉,我今晚有黄油复制手指。这些东西带有内部frames是另一个答案的来源。:PI也这么认为,我也这么做过很多次:)