Java Image Flicker

时间:2011-05-17 19:46:14

标签: java animated-gif

大家好我正在研究一个应该在键输入时改变图像的程序。我为每个图像使用了动画gif,我想知道为什么只有我的左到右动画gif在运行时闪烁。我已经在论坛上看了一下,并且看到java默认启用了双缓冲,但是为了以防万一,我已经明确地设置了它,为什么会发生这种情况?


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KeyEventAnimation extends JApplet implements KeyListener
{
    Image img;
    JLabel zil;
    int x=0, y=0, speed=10;     // x,y coordinates and how many pixels move
    JPanel pane;
    public void init( )
    {
        pane = new JPanel( );
        pane.setLayout( null );
        pane.setBackground( Color.WHITE );
        img = getImage( getCodeBase( ), "zil_walk_front.gif" );
        zil = new JLabel( new ImageIcon(img) );
        zil.setSize( img.getWidth(this), img.getHeight(this) );

        addKeyListener(this);
        pane.add( zil, 0, 0 );
        add( pane, BorderLayout.CENTER );
        setFocusable(true);
    }
    public void keyReleased( KeyEvent ke ) { }
    public void keyTyped( KeyEvent ke ) { }
    public void keyPressed( KeyEvent ke )
    {
        int code = ke.getKeyCode( );
        if( code == KeyEvent.VK_UP ){
            y -= speed;
                zil.setIcon(new ImageIcon("zil_walk_back.gif"));
       } else if ( code == KeyEvent.VK_DOWN ){
            y += speed;
                zil.setIcon(new ImageIcon("zil_walk_front.gif"));
       } else if ( code == KeyEvent.VK_LEFT ){
            x -= speed;
                zil.setIcon(new ImageIcon("zil_walk_left.gif"));
       } else if ( code == KeyEvent.VK_RIGHT ){
            x += speed;
                zil.setIcon(new ImageIcon("zil_walk_right.gif"));
         }
         zil.setLocation(x,y); 
    }
}

2 个答案:

答案 0 :(得分:0)

我没有运行你的代码,但在我看来,这可能是设置图像到价值已经是综合症的常见情况。当您按下一个键(/按住它)时,它会多次被发送到应用程序/窗口(第一次按键和重复之间通常会有一些延迟)。如果添加一个实例变量来记住图像的状态(或按下的最后一个键),然后仅在按下不同的键时更改图像,我认为这可能会解决您的问题。 / p>

这可能不是那么正常,除了你没有缓存你的图标(你每次更改图像时都要创建一个新的ImageIcon对象)所以每次按下一个键时,图标都会重新加载文件。这也可能导致闪烁。

答案 1 :(得分:0)

好的,我尝试使用您正在使用的实际图片运行代码(可在谷歌图片搜索中使用)。

左侧图像看起来有问题。我注意到后面和前面的图像没有闪烁。 因此,如果您尝试使用前后图像替换左右图像,您将看到没有闪烁:)