我正在使用JLabel试图在其上绘制动画gif图像。我可以使用构造函数new JLabel(new ImageIcon(FML.class.getResource("giphy.gif")));
,这将工作得很好但是当我重写paint方法时,它似乎根本不想绘制它。图像不是静止的,它不存在!我应该提一下,下面显示的两种方法与PNG完全正常,但不是GIF。我错过了什么或者这是一个java bug吗?
(使用java 1.8)
编辑:我一直在环顾四周,似乎我并没有完全忘记我需要做什么,但我错过了一些东西。我看过很多帖子Like this one但在这种情况下似乎没有用。
我应该注意到,课堂上没有其他内容,这是一个简单的JPanel。
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class FML {
public static void main(String[] args) {
new FML();
}
public FML() {
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.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().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(FML.class.getResource("FmDxW.png")));
btn.setSize(50, 50);
btn.setRolloverEnabled(true);
animatedGif = new ImageIcon(FML.class.getResource("giphy.gif"));
btn.setRolloverIcon(animatedGif);
add(btn);
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
animatedGif.getImage().flush();
}
});
//I need this
final ImageIcon image = new ImageIcon(FML.class.getResource("giphy.gif"));
//To render over this
final ImageIcon image2 = new ImageIcon(FML.class.getResource("fmDxW.png"));
//I'm not understanding why I can add the gif into the constructor but the paint method fails.
JLabel label = new JLabel(image) {
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(image2.getImage(), 64, 64, this);
}
};
//setSize because I want to be 100% sure that it's loading the correct size.
//Removing it doesn't affect the problem at hand.
label.setSize(64, 64);
add(label);
}
}
}
答案 0 :(得分:0)
g.drawImage(image2.getImage(), 64, 64, this);
假设您的图像大小为64,为什么要尝试在标签范围之外绘制第二个图像?当我将位置更改为(0,0)时,gif为我绘画很好(但我没有使用动画gif)。
下面显示的两种方法与PNG完全正常,但不是GIF。
我不知道上面提到的原因是怎么回事。无论如何,你是否用普通的gif尝试过它?
这就是为什么你不应该自己管理这幅画的原因,因为现在你需要担心位置并且硬编码位置不是一个好习惯。让你的布局经理为你做这件事。
再次,你为什么要这样做。为什么要尝试覆盖绘制方法以绘制第二个图像?
相反,你应该做的事情如下:
OverlayLayout
的面板,然后您可以将两个标签叠放在一起。// setSize因为我想100%确定它正在加载正确的大小。
您说您知道布局管理员的工作方式。好吧,如果你这样做,你知道这个语句将什么都不做,因为布局管理器会覆盖你设置的任何值,所以使用这样的代码错误并显示基本缺乏理解,不应该包含在MCVE
中MCVE`的目的是尽可能地简化问题。