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