Java 动画图像图标作为按钮

Java 动画图像图标作为按钮,java,swing,jbutton,animated-gif,imageicon,Java,Swing,Jbutton,Animated Gif,Imageicon,我有一个imageIcon作为按钮,现在我想在你翻滚时设置它的动画。我尝试在setRolloverIcon(图标)上使用动画gif(无循环)。但当我再次悬停在按钮上时,gif不再播放。当我使用循环gif时,它会从随机帧播放。我尝试使用paintComponent将形状或图像绘制为按钮,效果很好,但即使使用setPreferredSize()或setSize()或setMaximumSize()时,按钮也会使用其默认大小,如图中所示(中间按钮)。我在使用GroupLayout,这可能是问题所在吗

我有一个imageIcon作为按钮,现在我想在你翻滚时设置它的动画。我尝试在setRolloverIcon(图标)上使用动画gif(无循环)。但当我再次悬停在按钮上时,gif不再播放。当我使用循环gif时,它会从随机帧播放。我尝试使用paintComponent将形状或图像绘制为按钮,效果很好,但即使使用setPreferredSize()或setSize()或setMaximumSize()时,按钮也会使用其默认大小,如图中所示(中间按钮)。我在使用GroupLayout,这可能是问题所在吗


对我来说似乎很好

我使用了以下图标…(png和gif)

我刚刚意识到您使用的是非循环gif。这意味着您将尝试重新设置以重新开始播放


尝试使用类似于icon.getImage().flush()的东西,其中
图标
是您的
图像图标
。您必须在按钮上附加一个
MouseListener
,以检测
mouseEnter
事件并重置
ImageIcon

动画gif将无法工作。你需要使用多个图像作为框架。我认为它需要像精灵一样的东西。我试过了,但按钮仍然使用默认大小,如图所示。请您测试我的代码,因为它不工作,您的或我的too@mKorbel您可以尝试使用
图标.getImage().flush()
,而不是使用
按钮.setIcon(null)
,这将迫使JVM重新加载图标并再次开始播放…不是我尝试了flush(),试图覆盖BasicButtoni,因为MetalLaF无法工作,缺少了一些东西notifiers@mKorbel对于SystemL&F required flush(),似乎可以正常工作(据我所知,手头没有一个循环gif:P),但仍然只能在setIcon端实现,setRollover在Win8/Java7中不做任何事情
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AnimatedButton {

    public static void main(String[] args) {
        new AnimatedButton();
    }

    public AnimatedButton() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private ImageIcon animatedGif;

        public TestPane() {
            setLayout(new GridBagLayout());
            JButton btn = new JButton(new ImageIcon("WildPony.png"));
            btn.setRolloverEnabled(true);
            animatedGif = new ImageIcon("ajax-loader.gif");
            btn.setRolloverIcon(animatedGif);
            add(btn);

            btn.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseEntered(MouseEvent e) {
                    animatedGif.getImage().flush();
                }

            });
        }    
    }
}