2017-04-19 43 views
2

我正在使用两个.gif文件并将它们切换到一个帧中。如何从Java Swing的第一帧启动.gif文件?

private Image currentGIF; 

if(x == 0) gif = "image1.gif" 
if(x == 1) gif = "image2.gif" 
ImageIcon reference = new ImageIcon(gif); 
currentGIF = reference.getImage(); 

-

public void paint(Graphics g) 
{ 
    Graphics2D graphic = (Graphics2D) g; 
    graphic.drawImage(gif, 0, 0, this); 
    g.dispose(); 
} 

-

@Override public void actionPerformed(ActionEvent arg0) 
{ 
    repaint(); 
} 

这是我的问题:

  1. image1.gif开始在第一帧。
  2. image2.gif从第一帧开始。
  3. image1.gif从随机帧开始。

看来.gif保持运行,当我告诉image1再不会在第一帧开始。

+0

您可能还想看看['Image#flush'](http://docs.oracle.com/javase/7/docs/api/java/awt/Image.html#flush( )) – MadProgrammer

回答

2

问题:

  1. 永不覆盖一个JFrame的paint方法,而是一个JPanel的paintComponent方法里面内完成绘图。
  2. 切勿将被JVM给你的画法(油漆或的paintComponent)Graphics对象,因为这打破了绘画链。
  3. 不要在绘画方法中更改GUI的状态(例如交换图像)。取而代之的是在某种类型的侦听器中进行处理,这些侦听器会对您想要用来更改图像的事件做出反应 - 例如,如果按钮按下时更改按钮的ActionListener,或者更改图像时使用Swing Timer的ActionListener在计时器改变。
  4. 如果这不是一个GIF动画,强烈考虑将图像转换成一个ImageIcon,只需再次使用setIcon(...)与您希望使用监听器换一个JLabel的图标。