【问题标题】:Image animation in java swing on click单击时java中的图像动画
【发布时间】:2013-04-09 00:27:05
【问题描述】:

假设我有一个JFrame 和一个JButton。单击按钮后,我想显示动画 (.gif) 图像。而另一个事件(比如ActionEvent e)停止在JFrame 中显示动画。我的方法应该是什么?

【问题讨论】:

  • @EranMedan :我认为他想要startstop 动画,而不仅仅是展示它
  • 我想我既不是试图只显示图像,也不是对框架有问题,所以这些建议没有帮助。
  • “我想在单击按钮后显示动画(最好是.gif)图像。” GIF 是唯一支持动画的格式。所以说“最好”只会让人们感到困惑。我猜重要的一点是“动画”。请确认并编辑您的问题,以便更清楚。
  • these suggestions are not helping. 那么也许你应该问一个明确的问题。人们正在尽力利用所提供的信息。
  • 去掉“最好”这个词并不能解决任何问题。

标签: java image swing jbutton animated-gif


【解决方案1】:

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);
    }
}

【讨论】:

  • 如何访问 gif 中的单个帧/图像?
  • 图片来源见this answer
  • +1,您在我发布答案时更新了源代码。我想知道内部框架与此有什么关系。
  • @camickr 对不起,我今晚有黄油复制手指。带有内部框架的东西是另一个答案的来源。 :P
  • 我想了很多,我也这样做了很多次 :)
【解决方案2】:

我不知道如何从 gif 中获取帧/图像,但如果您可以访问它们,那么您可以使用 Animated Icon 类为您制作动画。它在幕后使用计时器来制作动画,因此您可以根据需要简单地启动/停止/暂停计时器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多